summaryrefslogtreecommitdiff
path: root/protocols/Tox/libtox
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Tox/libtox')
-rw-r--r--protocols/Tox/libtox/src/toxcore/DHT.c684
-rw-r--r--protocols/Tox/libtox/src/toxcore/DHT.h58
-rw-r--r--protocols/Tox/libtox/src/toxcore/LAN_discovery.c93
-rw-r--r--protocols/Tox/libtox/src/toxcore/Messenger.c297
-rw-r--r--protocols/Tox/libtox/src/toxcore/Messenger.h17
-rw-r--r--protocols/Tox/libtox/src/toxcore/TCP_client.c32
-rw-r--r--protocols/Tox/libtox/src/toxcore/TCP_connection.c66
-rw-r--r--protocols/Tox/libtox/src/toxcore/TCP_server.c40
-rw-r--r--protocols/Tox/libtox/src/toxcore/ccompat.h24
-rw-r--r--protocols/Tox/libtox/src/toxcore/crypto_core.api.h8
-rw-r--r--protocols/Tox/libtox/src/toxcore/crypto_core.c2
-rw-r--r--protocols/Tox/libtox/src/toxcore/crypto_core.h8
-rw-r--r--protocols/Tox/libtox/src/toxcore/crypto_core_test.cpp96
-rw-r--r--protocols/Tox/libtox/src/toxcore/friend_connection.c238
-rw-r--r--protocols/Tox/libtox/src/toxcore/friend_requests.c27
-rw-r--r--protocols/Tox/libtox/src/toxcore/group.c258
-rw-r--r--protocols/Tox/libtox/src/toxcore/group.h102
-rw-r--r--protocols/Tox/libtox/src/toxcore/list.c10
-rw-r--r--protocols/Tox/libtox/src/toxcore/logger.h6
-rw-r--r--protocols/Tox/libtox/src/toxcore/net_crypto.c161
-rw-r--r--protocols/Tox/libtox/src/toxcore/network.c210
-rw-r--r--protocols/Tox/libtox/src/toxcore/network.h38
-rw-r--r--protocols/Tox/libtox/src/toxcore/onion.c42
-rw-r--r--protocols/Tox/libtox/src/toxcore/onion_announce.c32
-rw-r--r--protocols/Tox/libtox/src/toxcore/onion_client.c87
-rw-r--r--protocols/Tox/libtox/src/toxcore/ping.c40
-rw-r--r--protocols/Tox/libtox/src/toxcore/ping_array.c18
-rw-r--r--protocols/Tox/libtox/src/toxcore/tox.api.h100
-rw-r--r--protocols/Tox/libtox/src/toxcore/tox.c46
-rw-r--r--protocols/Tox/libtox/src/toxcore/tox.h91
-rw-r--r--protocols/Tox/libtox/src/toxcore/tox_api.c24
-rw-r--r--protocols/Tox/libtox/src/toxcore/util.c20
-rw-r--r--protocols/Tox/libtox/src/toxcore/util.h11
-rw-r--r--protocols/Tox/libtox/src/toxcore/util_test.cpp55
-rw-r--r--protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c9
35 files changed, 1745 insertions, 1305 deletions
diff --git a/protocols/Tox/libtox/src/toxcore/DHT.c b/protocols/Tox/libtox/src/toxcore/DHT.c
index a42515181c..4acfa1617d 100644
--- a/protocols/Tox/libtox/src/toxcore/DHT.c
+++ b/protocols/Tox/libtox/src/toxcore/DHT.c
@@ -59,6 +59,92 @@
#define ASSOC_COUNT 2
+struct DHT {
+ Logger *log;
+ Networking_Core *net;
+
+ bool hole_punching_enabled;
+
+ Client_data close_clientlist[LCLIENT_LIST];
+ uint64_t close_lastgetnodes;
+ uint32_t close_bootstrap_times;
+
+ /* DHT keypair */
+ uint8_t self_public_key[CRYPTO_PUBLIC_KEY_SIZE];
+ uint8_t self_secret_key[CRYPTO_SECRET_KEY_SIZE];
+
+ DHT_Friend *friends_list;
+ uint16_t num_friends;
+
+ Node_format *loaded_nodes_list;
+ uint32_t loaded_num_nodes;
+ unsigned int loaded_nodes_index;
+
+ Shared_Keys shared_keys_recv;
+ Shared_Keys shared_keys_sent;
+
+ struct Ping *ping;
+ Ping_Array *dht_ping_array;
+ Ping_Array *dht_harden_ping_array;
+ uint64_t last_run;
+
+ Cryptopacket_Handles cryptopackethandlers[256];
+
+ Node_format to_bootstrap[MAX_CLOSE_TO_BOOTSTRAP_NODES];
+ unsigned int num_to_bootstrap;
+};
+
+const uint8_t *dht_get_self_public_key(const DHT *dht)
+{
+ return dht->self_public_key;
+}
+const uint8_t *dht_get_self_secret_key(const DHT *dht)
+{
+ return dht->self_secret_key;
+}
+
+void dht_set_self_public_key(DHT *dht, const uint8_t *key)
+{
+ memcpy(dht->self_public_key, key, CRYPTO_PUBLIC_KEY_SIZE);
+}
+void dht_set_self_secret_key(DHT *dht, const uint8_t *key)
+{
+ memcpy(dht->self_secret_key, key, CRYPTO_SECRET_KEY_SIZE);
+}
+
+Networking_Core *dht_get_net(const DHT *dht)
+{
+ return dht->net;
+}
+struct Ping *dht_get_ping(const DHT *dht)
+{
+ return dht->ping;
+}
+const Client_data *dht_get_close_clientlist(const DHT *dht)
+{
+ return dht->close_clientlist;
+}
+const Client_data *dht_get_close_client(const DHT *dht, uint32_t client_num)
+{
+ assert(client_num < sizeof(dht->close_clientlist) / sizeof(dht->close_clientlist[0]));
+ return &dht->close_clientlist[client_num];
+}
+uint16_t dht_get_num_friends(const DHT *dht)
+{
+ return dht->num_friends;
+}
+
+DHT_Friend *dht_get_friend(DHT *dht, uint32_t friend_num)
+{
+ assert(friend_num < dht->num_friends);
+ return &dht->friends_list[friend_num];
+}
+const uint8_t *dht_get_friend_public_key(const DHT *dht, uint32_t friend_num)
+{
+ assert(friend_num < dht->num_friends);
+ return dht->friends_list[friend_num].public_key;
+}
+
/* Compares pk1 and pk2 with pk.
*
* return 0 if both are same distance.
@@ -68,8 +154,8 @@
int id_closest(const uint8_t *pk, const uint8_t *pk1, const uint8_t *pk2)
{
for (size_t i = 0; i < CRYPTO_PUBLIC_KEY_SIZE; ++i) {
- uint8_t distance1 = pk[i] ^ pk1[i];
- uint8_t distance2 = pk[i] ^ pk2[i];
+ const uint8_t distance1 = pk[i] ^ pk1[i];
+ const uint8_t distance2 = pk[i] ^ pk2[i];
if (distance1 < distance2) {
return 1;
@@ -96,7 +182,7 @@ static unsigned int bit_by_bit_cmp(const uint8_t *pk1, const uint8_t *pk2)
}
for (j = 0; j < 8; ++j) {
- uint8_t mask = 1 << (7 - j);
+ const uint8_t mask = 1 << (7 - j);
if ((pk1[i] & mask) != (pk2[i] & mask)) {
break;
@@ -121,8 +207,8 @@ void get_shared_key(Shared_Keys *shared_keys, uint8_t *shared_key, const uint8_t
uint32_t curr = 0;
for (uint32_t i = 0; i < MAX_KEYS_PER_SLOT; ++i) {
- int index = public_key[30] * MAX_KEYS_PER_SLOT + i;
- Shared_Key *key = &shared_keys->keys[index];
+ const int index = public_key[30] * MAX_KEYS_PER_SLOT + i;
+ Shared_Key *const key = &shared_keys->keys[index];
if (key->stored) {
if (id_equal(public_key, key->public_key)) {
@@ -149,8 +235,8 @@ void get_shared_key(Shared_Keys *shared_keys, uint8_t *shared_key, const uint8_t
encrypt_precompute(public_key, secret_key, shared_key);
- if (num != (uint32_t)~0) {
- Shared_Key *key = &shared_keys->keys[curr];
+ if (num != UINT32_MAX) {
+ Shared_Key *const key = &shared_keys->keys[curr];
key->stored = 1;
key->times_requested = 1;
memcpy(key->public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE);
@@ -198,13 +284,13 @@ int create_request(const uint8_t *send_public_key, const uint8_t *send_secret_ke
return -1;
}
- uint8_t *nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2;
+ uint8_t *const nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2;
random_nonce(nonce);
uint8_t temp[MAX_CRYPTO_REQUEST_SIZE];
memcpy(temp + 1, data, length);
temp[0] = request_id;
- int len = encrypt_data(recv_public_key, send_secret_key, nonce, temp, length + 1,
- CRYPTO_SIZE + packet);
+ const int len = encrypt_data(recv_public_key, send_secret_key, nonce, temp, length + 1,
+ CRYPTO_SIZE + packet);
if (len == -1) {
crypto_memzero(temp, MAX_CRYPTO_REQUEST_SIZE);
@@ -241,7 +327,7 @@ int handle_request(const uint8_t *self_public_key, const uint8_t *self_secret_ke
}
memcpy(public_key, packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, CRYPTO_PUBLIC_KEY_SIZE);
- const uint8_t *nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2;
+ const uint8_t *const nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2;
uint8_t temp[MAX_CRYPTO_REQUEST_SIZE];
int len1 = decrypt_data(public_key, self_secret_key, nonce,
packet + CRYPTO_SIZE, length - CRYPTO_SIZE, temp);
@@ -288,7 +374,7 @@ int packed_node_size(uint8_t ip_family)
*/
int pack_ip_port(uint8_t *data, uint16_t length, const IP_Port *ip_port)
{
- if (data == NULL) {
+ if (data == nullptr) {
return -1;
}
@@ -313,25 +399,25 @@ int pack_ip_port(uint8_t *data, uint16_t length, const IP_Port *ip_port)
}
if (is_ipv4) {
- uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t);
+ const uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t);
if (size > length) {
return -1;
}
data[0] = net_family;
- memcpy(data + 1, &ip_port->ip.ip4, SIZE_IP4);
+ memcpy(data + 1, &ip_port->ip.ip.v4, SIZE_IP4);
memcpy(data + 1 + SIZE_IP4, &ip_port->port, sizeof(uint16_t));
return size;
} else {
- uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t);
+ const uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t);
if (size > length) {
return -1;
}
data[0] = net_family;
- memcpy(data + 1, &ip_port->ip.ip6, SIZE_IP6);
+ memcpy(data + 1, &ip_port->ip.ip.v6, SIZE_IP6);
memcpy(data + 1 + SIZE_IP6, &ip_port->port, sizeof(uint16_t));
return size;
}
@@ -345,7 +431,7 @@ static int DHT_create_packet(const uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE],
random_nonce(nonce);
- int encrypted_length = encrypt_data_symmetric(shared_key, nonce, plain, plain_length, encrypted);
+ const int encrypted_length = encrypt_data_symmetric(shared_key, nonce, plain, plain_length, encrypted);
if (encrypted_length == -1) {
return -1;
@@ -366,7 +452,7 @@ static int DHT_create_packet(const uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE],
*/
int unpack_ip_port(IP_Port *ip_port, const uint8_t *data, uint16_t length, uint8_t tcp_enabled)
{
- if (data == NULL) {
+ if (data == nullptr) {
return -1;
}
@@ -398,25 +484,25 @@ int unpack_ip_port(IP_Port *ip_port, const uint8_t *data, uint16_t length, uint8
}
if (is_ipv4) {
- uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t);
+ const uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t);
if (size > length) {
return -1;
}
ip_port->ip.family = host_family;
- memcpy(&ip_port->ip.ip4, data + 1, SIZE_IP4);
+ memcpy(&ip_port->ip.ip.v4, data + 1, SIZE_IP4);
memcpy(&ip_port->port, data + 1 + SIZE_IP4, sizeof(uint16_t));
return size;
} else {
- uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t);
+ const uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t);
if (size > length) {
return -1;
}
ip_port->ip.family = host_family;
- memcpy(&ip_port->ip.ip6, data + 1, SIZE_IP6);
+ memcpy(&ip_port->ip.ip.v6, data + 1, SIZE_IP6);
memcpy(&ip_port->port, data + 1 + SIZE_IP6, sizeof(uint16_t));
return size;
}
@@ -432,7 +518,7 @@ int pack_nodes(uint8_t *data, uint16_t length, const Node_format *nodes, uint16_
uint32_t packed_length = 0;
for (uint32_t i = 0; i < number && packed_length < length; ++i) {
- int ipp_size = pack_ip_port(data + packed_length, length - packed_length, &nodes[i].ip_port);
+ const int ipp_size = pack_ip_port(data + packed_length, length - packed_length, &nodes[i].ip_port);
if (ipp_size == -1) {
return -1;
@@ -447,7 +533,7 @@ int pack_nodes(uint8_t *data, uint16_t length, const Node_format *nodes, uint16_
memcpy(data + packed_length, nodes[i].public_key, CRYPTO_PUBLIC_KEY_SIZE);
packed_length += CRYPTO_PUBLIC_KEY_SIZE;
- uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE;
+ const uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE;
assert(increment == PACKED_NODE_SIZE_IP4 || increment == PACKED_NODE_SIZE_IP6);
}
@@ -467,7 +553,7 @@ int unpack_nodes(Node_format *nodes, uint16_t max_num_nodes, uint16_t *processed
uint32_t num = 0, len_processed = 0;
while (num < max_num_nodes && len_processed < length) {
- int ipp_size = unpack_ip_port(&nodes[num].ip_port, data + len_processed, length - len_processed, tcp_enabled);
+ const int ipp_size = unpack_ip_port(&nodes[num].ip_port, data + len_processed, length - len_processed, tcp_enabled);
if (ipp_size == -1) {
return -1;
@@ -483,7 +569,7 @@ int unpack_nodes(Node_format *nodes, uint16_t max_num_nodes, uint16_t *processed
len_processed += CRYPTO_PUBLIC_KEY_SIZE;
++num;
- uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE;
+ const uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE;
assert(increment == PACKED_NODE_SIZE_IP4 || increment == PACKED_NODE_SIZE_IP6);
}
@@ -529,8 +615,8 @@ static uint32_t index_of_node_pk(const Node_format *array, uint32_t size, const
static uint32_t index_of_client_ip_port(const Client_data *array, uint32_t size, const IP_Port *ip_port)
{
for (uint32_t i = 0; i < size; ++i) {
- if (ip_port->ip.family == TOX_AF_INET && ipport_equal(&array[i].assoc4.ip_port, ip_port) ||
- ip_port->ip.family == TOX_AF_INET6 && ipport_equal(&array[i].assoc6.ip_port, ip_port)) {
+ if ((ip_port->ip.family == TOX_AF_INET && ipport_equal(&array[i].assoc4.ip_port, ip_port)) ||
+ (ip_port->ip.family == TOX_AF_INET6 && ipport_equal(&array[i].assoc6.ip_port, ip_port))) {
return i;
}
}
@@ -583,7 +669,7 @@ static void update_client(Logger *log, int index, Client_data *client, IP_Port i
static int client_or_ip_port_in_list(Logger *log, Client_data *list, uint16_t length, const uint8_t *public_key,
IP_Port ip_port)
{
- uint64_t temp_time = unix_time();
+ const uint64_t temp_time = unix_time();
uint32_t index = index_of_client_pk(list, length, public_key);
/* if public_key is in list, find it and maybe overwrite ip_port */
@@ -677,14 +763,14 @@ static void get_close_nodes_inner(const uint8_t *public_key, Node_format *nodes_
uint32_t num_nodes = *num_nodes_ptr;
for (uint32_t i = 0; i < client_list_length; i++) {
- const Client_data *client = &client_list[i];
+ const Client_data *const client = &client_list[i];
/* node already in list? */
if (index_of_node_pk(nodes_list, MAX_SENT_NODES, client->public_key) != UINT32_MAX) {
continue;
}
- const IPPTsPng *ipptp = NULL;
+ const IPPTsPng *ipptp = nullptr;
if (sa_family == TOX_AF_INET) {
ipptp = &client->assoc4;
@@ -775,8 +861,8 @@ static int cmp_dht_entry(const void *a, const void *b)
DHT_Cmp_data cmp1, cmp2;
memcpy(&cmp1, a, sizeof(DHT_Cmp_data));
memcpy(&cmp2, b, sizeof(DHT_Cmp_data));
- Client_data entry1 = cmp1.entry;
- Client_data entry2 = cmp2.entry;
+ const Client_data entry1 = cmp1.entry;
+ const Client_data entry2 = cmp2.entry;
const uint8_t *cmp_public_key = cmp1.base_public_key;
#define ASSOC_TIMEOUT(assoc) is_timeout((assoc).timestamp, BAD_NODE_TIMEOUT)
@@ -809,7 +895,7 @@ static int cmp_dht_entry(const void *a, const void *b)
return 1;
}
- int close = id_closest(cmp_public_key, entry1.public_key, entry2.public_key);
+ const int close = id_closest(cmp_public_key, entry1.public_key, entry2.public_key);
if (close == 1) {
return 1;
@@ -829,9 +915,9 @@ static int cmp_dht_entry(const void *a, const void *b)
*/
static unsigned int store_node_ok(const Client_data *client, const uint8_t *public_key, const uint8_t *comp_public_key)
{
- return is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) &&
- is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT) ||
- id_closest(comp_public_key, client->public_key, public_key) == 2;
+ return (is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT)
+ && is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT))
+ || id_closest(comp_public_key, client->public_key, public_key) == 2;
}
static void sort_client_list(Client_data *list, unsigned int length, const uint8_t *comp_public_key)
@@ -854,8 +940,8 @@ static void sort_client_list(Client_data *list, unsigned int length, const uint8
static void update_client_with_reset(Client_data *client, const IP_Port *ip_port)
{
- IPPTsPng *ipptp_write = NULL;
- IPPTsPng *ipptp_clear = NULL;
+ IPPTsPng *ipptp_write = nullptr;
+ IPPTsPng *ipptp_clear = nullptr;
if (ip_port->ip.family == TOX_AF_INET) {
ipptp_write = &client->assoc4;
@@ -888,29 +974,29 @@ static void update_client_with_reset(Client_data *client, const IP_Port *ip_port
* and all nodes in the list are closer to comp_public_key
* than public_key.
*
- * returns True(1) when the item was stored, False(0) otherwise */
-static int replace_all(Client_data *list,
- uint16_t length,
- const uint8_t *public_key,
- IP_Port ip_port,
- const uint8_t *comp_public_key)
+ * returns true when the item was stored, false otherwise */
+static bool replace_all(Client_data *list,
+ uint16_t length,
+ const uint8_t *public_key,
+ IP_Port ip_port,
+ const uint8_t *comp_public_key)
{
if ((ip_port.ip.family != TOX_AF_INET) && (ip_port.ip.family != TOX_AF_INET6)) {
- return 0;
+ return false;
}
if (!store_node_ok(&list[1], public_key, comp_public_key) &&
!store_node_ok(&list[0], public_key, comp_public_key)) {
- return 0;
+ return false;
}
sort_client_list(list, length, comp_public_key);
- Client_data *client = &list[0];
+ Client_data *const client = &list[0];
id_copy(client->public_key, public_key);
update_client_with_reset(client, &ip_port);
- return 1;
+ return true;
}
/* Add node to close list.
@@ -931,7 +1017,7 @@ static int add_to_close(DHT *dht, const uint8_t *public_key, IP_Port ip_port, bo
for (uint32_t i = 0; i < LCLIENT_NODES; ++i) {
/* TODO(iphydf): write bounds checking test to catch the case that
* index is left as >= LCLIENT_LENGTH */
- Client_data *client = &dht->close_clientlist[(index * LCLIENT_NODES) + i];
+ Client_data *const client = &dht->close_clientlist[(index * LCLIENT_NODES) + i];
if (!is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) ||
!is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT)) {
@@ -957,18 +1043,18 @@ bool node_addable_to_close_list(DHT *dht, const uint8_t *public_key, IP_Port ip_
return add_to_close(dht, public_key, ip_port, 1) == 0;
}
-static bool is_pk_in_client_list(Client_data *list, unsigned int client_list_length, const uint8_t *public_key,
+static bool is_pk_in_client_list(const Client_data *list, unsigned int client_list_length, const uint8_t *public_key,
IP_Port ip_port)
{
- uint32_t index = index_of_client_pk(list, client_list_length, public_key);
+ const uint32_t index = index_of_client_pk(list, client_list_length, public_key);
if (index == UINT32_MAX) {
return 0;
}
- const IPPTsPng *assoc = ip_port.ip.family == TOX_AF_INET ?
- &list[index].assoc4 :
- &list[index].assoc6;
+ const IPPTsPng *assoc = ip_port.ip.family == TOX_AF_INET
+ ? &list[index].assoc4
+ : &list[index].assoc6;
return !is_timeout(assoc->timestamp, BAD_NODE_TIMEOUT);
}
@@ -987,52 +1073,54 @@ static bool is_pk_in_close_list(DHT *dht, const uint8_t *public_key, IP_Port ip_
/* Check if the node obtained with a get_nodes with public_key should be pinged.
* NOTE: for best results call it after addto_lists;
*
- * return 0 if the node should not be pinged.
- * return 1 if it should.
+ * return false if the node should not be pinged.
+ * return true if it should.
*/
-static unsigned int ping_node_from_getnodes_ok(DHT *dht, const uint8_t *public_key, IP_Port ip_port)
+static bool ping_node_from_getnodes_ok(DHT *dht, const uint8_t *public_key, IP_Port ip_port)
{
- bool ret = 0;
+ bool ret = false;
if (add_to_close(dht, public_key, ip_port, 1) == 0) {
- ret = 1;
+ ret = true;
}
- unsigned int *num = &dht->num_to_bootstrap;
- uint32_t index = index_of_node_pk(dht->to_bootstrap, *num, public_key);
- bool in_close_list = is_pk_in_close_list(dht, public_key, ip_port);
+ {
+ unsigned int *const num = &dht->num_to_bootstrap;
+ const uint32_t index = index_of_node_pk(dht->to_bootstrap, *num, public_key);
+ const bool in_close_list = is_pk_in_close_list(dht, public_key, ip_port);
- if (ret && index == UINT32_MAX && !in_close_list) {
- if (*num < MAX_CLOSE_TO_BOOTSTRAP_NODES) {
- memcpy(dht->to_bootstrap[*num].public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE);
- dht->to_bootstrap[*num].ip_port = ip_port;
- ++*num;
- } else {
- // TODO(irungentoo): ipv6 vs v4
- add_to_list(dht->to_bootstrap, MAX_CLOSE_TO_BOOTSTRAP_NODES, public_key, ip_port, dht->self_public_key);
+ if (ret && index == UINT32_MAX && !in_close_list) {
+ if (*num < MAX_CLOSE_TO_BOOTSTRAP_NODES) {
+ memcpy(dht->to_bootstrap[*num].public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE);
+ dht->to_bootstrap[*num].ip_port = ip_port;
+ ++*num;
+ } else {
+ // TODO(irungentoo): ipv6 vs v4
+ add_to_list(dht->to_bootstrap, MAX_CLOSE_TO_BOOTSTRAP_NODES, public_key, ip_port, dht->self_public_key);
+ }
}
}
for (uint32_t i = 0; i < dht->num_friends; ++i) {
- bool store_ok = 0;
-
DHT_Friend *dht_friend = &dht->friends_list[i];
+ bool store_ok = false;
+
if (store_node_ok(&dht_friend->client_list[1], public_key, dht_friend->public_key)) {
- store_ok = 1;
+ store_ok = true;
}
if (store_node_ok(&dht_friend->client_list[0], public_key, dht_friend->public_key)) {
- store_ok = 1;
+ store_ok = true;
}
- unsigned int *friend_num = &dht_friend->num_to_bootstrap;
+ unsigned int *const friend_num = &dht_friend->num_to_bootstrap;
const uint32_t index = index_of_node_pk(dht_friend->to_bootstrap, *friend_num, public_key);
const bool pk_in_list = is_pk_in_client_list(dht_friend->client_list, MAX_FRIEND_CLIENTS, public_key, ip_port);
if (store_ok && index == UINT32_MAX && !pk_in_list) {
if (*friend_num < MAX_SENT_NODES) {
- Node_format *format = &dht_friend->to_bootstrap[*friend_num];
+ Node_format *const format = &dht_friend->to_bootstrap[*friend_num];
memcpy(format->public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE);
format->ip_port = ip_port;
++*friend_num;
@@ -1040,7 +1128,7 @@ static unsigned int ping_node_from_getnodes_ok(DHT *dht, const uint8_t *public_k
add_to_list(dht_friend->to_bootstrap, MAX_SENT_NODES, public_key, ip_port, dht_friend->public_key);
}
- ret = 1;
+ ret = true;
}
}
@@ -1057,9 +1145,9 @@ uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key)
uint32_t used = 0;
/* convert IPv4-in-IPv6 to IPv4 */
- if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip6)) {
+ if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip.v6)) {
ip_port.ip.family = TOX_AF_INET;
- ip_port.ip.ip4.uint32 = ip_port.ip.ip6.uint32[3];
+ ip_port.ip.ip.v4.uint32 = ip_port.ip.ip.v6.uint32[3];
}
/* NOTE: Current behavior if there are two clients with the same id is
@@ -1073,7 +1161,7 @@ uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key)
used++;
}
- DHT_Friend *friend_foundip = 0;
+ DHT_Friend *friend_foundip = nullptr;
for (uint32_t i = 0; i < dht->num_friends; ++i) {
const bool in_list = client_or_ip_port_in_list(dht->log, dht->friends_list[i].client_list,
@@ -1108,14 +1196,14 @@ uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key)
static bool update_client_data(Client_data *array, size_t size, IP_Port ip_port, const uint8_t *pk)
{
- uint64_t temp_time = unix_time();
- uint32_t index = index_of_client_pk(array, size, pk);
+ const uint64_t temp_time = unix_time();
+ const uint32_t index = index_of_client_pk(array, size, pk);
if (index == UINT32_MAX) {
return false;
}
- Client_data *data = &array[index];
+ Client_data *const data = &array[index];
IPPTsPng *assoc;
if (ip_port.ip.family == TOX_AF_INET) {
@@ -1137,9 +1225,9 @@ static bool update_client_data(Client_data *array, size_t size, IP_Port ip_port,
static void returnedip_ports(DHT *dht, IP_Port ip_port, const uint8_t *public_key, const uint8_t *nodepublic_key)
{
/* convert IPv4-in-IPv6 to IPv4 */
- if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip6)) {
+ if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip.v6)) {
ip_port.ip.family = TOX_AF_INET;
- ip_port.ip.ip4.uint32 = ip_port.ip.ip6.uint32[3];
+ ip_port.ip.ip.v4.uint32 = ip_port.ip.ip.v6.uint32[3];
}
if (id_equal(public_key, dht->self_public_key)) {
@@ -1149,7 +1237,7 @@ static void returnedip_ports(DHT *dht, IP_Port ip_port, const uint8_t *public_ke
for (uint32_t i = 0; i < dht->num_friends; ++i) {
if (id_equal(public_key, dht->friends_list[i].public_key)) {
- Client_data *client_list = dht->friends_list[i].client_list;
+ Client_data *const client_list = dht->friends_list[i].client_list;
if (update_client_data(client_list, MAX_FRIEND_CLIENTS, ip_port, nodepublic_key)) {
return;
@@ -1177,7 +1265,7 @@ static int getnodes(DHT *dht, IP_Port ip_port, const uint8_t *public_key, const
uint64_t ping_id = 0;
- if (sendback_node != NULL) {
+ if (sendback_node != nullptr) {
memcpy(plain_message + sizeof(receiver), sendback_node, sizeof(Node_format));
ping_id = ping_array_add(dht->dht_harden_ping_array, plain_message, sizeof(plain_message));
} else {
@@ -1197,8 +1285,8 @@ static int getnodes(DHT *dht, IP_Port ip_port, const uint8_t *public_key, const
uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
DHT_get_shared_key_sent(dht, shared_key, public_key);
- int len = DHT_create_packet(dht->self_public_key, shared_key, NET_PACKET_GET_NODES,
- plain, sizeof(plain), data);
+ const int len = DHT_create_packet(dht->self_public_key, shared_key, NET_PACKET_GET_NODES,
+ plain, sizeof(plain), data);
if (len != sizeof(data)) {
return -1;
@@ -1220,17 +1308,17 @@ static int sendnodes_ipv6(const DHT *dht, IP_Port ip_port, const uint8_t *public
return -1;
}
- size_t Node_format_size = sizeof(Node_format);
+ const size_t node_format_size = sizeof(Node_format);
Node_format nodes_list[MAX_SENT_NODES];
- uint32_t num_nodes = get_close_nodes(dht, client_id, nodes_list, 0, ip_is_lan(ip_port.ip) == 0, 1);
+ const uint32_t num_nodes = get_close_nodes(dht, client_id, nodes_list, 0, ip_is_lan(ip_port.ip) == 0, 1);
- VLA(uint8_t, plain, 1 + Node_format_size * MAX_SENT_NODES + length);
+ VLA(uint8_t, plain, 1 + node_format_size * MAX_SENT_NODES + length);
int nodes_length = 0;
if (num_nodes) {
- nodes_length = pack_nodes(plain + 1, Node_format_size * MAX_SENT_NODES, nodes_list, num_nodes);
+ nodes_length = pack_nodes(plain + 1, node_format_size * MAX_SENT_NODES, nodes_list, num_nodes);
if (nodes_length <= 0) {
return -1;
@@ -1243,8 +1331,8 @@ static int sendnodes_ipv6(const DHT *dht, IP_Port ip_port, const uint8_t *public
const uint32_t crypto_size = 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + CRYPTO_MAC_SIZE;
VLA(uint8_t, data, 1 + nodes_length + length + crypto_size);
- int len = DHT_create_packet(dht->self_public_key, shared_encryption_key, NET_PACKET_SEND_NODES_IPV6,
- plain, 1 + nodes_length + length, data);
+ const int len = DHT_create_packet(dht->self_public_key, shared_encryption_key, NET_PACKET_SEND_NODES_IPV6,
+ plain, 1 + nodes_length + length, data);
if (len != SIZEOF_VLA(data)) {
return -1;
@@ -1258,41 +1346,42 @@ static int sendnodes_ipv6(const DHT *dht, IP_Port ip_port, const uint8_t *public
static int handle_getnodes(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata)
{
if (length != (CRYPTO_SIZE + CRYPTO_MAC_SIZE + sizeof(uint64_t))) {
- return 1;
+ return true;
}
- DHT *dht = (DHT *)object;
+ DHT *const dht = (DHT *)object;
/* Check if packet is from ourself. */
if (id_equal(packet + 1, dht->self_public_key)) {
- return 1;
+ return true;
}
uint8_t plain[CRYPTO_NODE_SIZE];
uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
DHT_get_shared_key_recv(dht, shared_key, packet + 1);
- int len = decrypt_data_symmetric(
- shared_key,
- packet + 1 + CRYPTO_PUBLIC_KEY_SIZE,
- packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE,
- CRYPTO_NODE_SIZE + CRYPTO_MAC_SIZE,
- plain);
+ const int len = decrypt_data_symmetric(
+ shared_key,
+ packet + 1 + CRYPTO_PUBLIC_KEY_SIZE,
+ packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE,
+ CRYPTO_NODE_SIZE + CRYPTO_MAC_SIZE,
+ plain);
if (len != CRYPTO_NODE_SIZE) {
- return 1;
+ return true;
}
sendnodes_ipv6(dht, source, packet + 1, plain, plain + CRYPTO_PUBLIC_KEY_SIZE, sizeof(uint64_t), shared_key);
ping_add(dht->ping, packet + 1, source);
- return 0;
+ return false;
}
-/* return 0 if no
- return 1 if yes */
-static uint8_t sent_getnode_to_node(DHT *dht, const uint8_t *public_key, IP_Port node_ip_port, uint64_t ping_id,
- Node_format *sendback_node)
+
+/* return false if no
+ return true if yes */
+static bool sent_getnode_to_node(DHT *dht, const uint8_t *public_key, IP_Port node_ip_port, uint64_t ping_id,
+ Node_format *sendback_node)
{
uint8_t data[sizeof(Node_format) * 2];
@@ -1301,17 +1390,17 @@ static uint8_t sent_getnode_to_node(DHT *dht, const uint8_t *public_key, IP_Port
} else if (ping_array_check(dht->dht_harden_ping_array, data, sizeof(data), ping_id) == sizeof(data)) {
memcpy(sendback_node, data + sizeof(Node_format), sizeof(Node_format));
} else {
- return 0;
+ return false;
}
Node_format test;
memcpy(&test, data, sizeof(Node_format));
if (!ipport_equal(&test.ip_port, &node_ip_port) || !id_equal(test.public_key, public_key)) {
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* Function is needed in following functions. */
@@ -1321,14 +1410,14 @@ static int send_hardening_getnode_res(const DHT *dht, const Node_format *sendto,
static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *packet, uint16_t length,
Node_format *plain_nodes, uint16_t size_plain_nodes, uint32_t *num_nodes_out)
{
- DHT *dht = (DHT *)object;
- uint32_t cid_size = 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + 1 + sizeof(uint64_t) + CRYPTO_MAC_SIZE;
+ DHT *const dht = (DHT *)object;
+ const uint32_t cid_size = 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + 1 + sizeof(uint64_t) + CRYPTO_MAC_SIZE;
if (length < cid_size) { /* too short */
return 1;
}
- uint32_t data_size = length - cid_size;
+ const uint32_t data_size = length - cid_size;
if (data_size == 0) {
return 1;
@@ -1341,12 +1430,12 @@ static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *pa
VLA(uint8_t, plain, 1 + data_size + sizeof(uint64_t));
uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
DHT_get_shared_key_sent(dht, shared_key, packet + 1);
- int len = decrypt_data_symmetric(
- shared_key,
- packet + 1 + CRYPTO_PUBLIC_KEY_SIZE,
- packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE,
- 1 + data_size + sizeof(uint64_t) + CRYPTO_MAC_SIZE,
- plain);
+ const int len = decrypt_data_symmetric(
+ shared_key,
+ packet + 1 + CRYPTO_PUBLIC_KEY_SIZE,
+ packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE,
+ 1 + data_size + sizeof(uint64_t) + CRYPTO_MAC_SIZE,
+ plain);
if ((unsigned int)len != SIZEOF_VLA(plain)) {
return 1;
@@ -1366,7 +1455,7 @@ static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *pa
}
uint16_t length_nodes = 0;
- int num_nodes = unpack_nodes(plain_nodes, plain[0], &length_nodes, plain + 1, data_size, 0);
+ const int num_nodes = unpack_nodes(plain_nodes, plain[0], &length_nodes, plain + 1, data_size, 0);
if (length_nodes != data_size) {
return 1;
@@ -1391,7 +1480,7 @@ static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *pa
static int handle_sendnodes_ipv6(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata)
{
- DHT *dht = (DHT *)object;
+ DHT *const dht = (DHT *)object;
Node_format plain_nodes[MAX_SENT_NODES];
uint32_t num_nodes;
@@ -1419,12 +1508,12 @@ static int handle_sendnodes_ipv6(void *object, IP_Port source, const uint8_t *pa
int DHT_addfriend(DHT *dht, const uint8_t *public_key, void (*ip_callback)(void *data, int32_t number, IP_Port),
void *data, int32_t number, uint16_t *lock_count)
{
- uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key);
+ const uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key);
uint16_t lock_num;
if (friend_num != UINT32_MAX) { /* Is friend already in DHT? */
- DHT_Friend *dht_friend = &dht->friends_list[friend_num];
+ DHT_Friend *const dht_friend = &dht->friends_list[friend_num];
if (dht_friend->lock_count == DHT_FRIEND_MAX_LOCKS) {
return -1;
@@ -1443,14 +1532,14 @@ int DHT_addfriend(DHT *dht, const uint8_t *public_key, void (*ip_callback)(void
return 0;
}
- DHT_Friend *temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends + 1));
+ DHT_Friend *const temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends + 1));
- if (temp == NULL) {
+ if (temp == nullptr) {
return -1;
}
dht->friends_list = temp;
- DHT_Friend *dht_friend = &dht->friends_list[dht->num_friends];
+ DHT_Friend *const dht_friend = &dht->friends_list[dht->num_friends];
memset(dht_friend, 0, sizeof(DHT_Friend));
memcpy(dht_friend->public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE);
@@ -1474,19 +1563,19 @@ int DHT_addfriend(DHT *dht, const uint8_t *public_key, void (*ip_callback)(void
int DHT_delfriend(DHT *dht, const uint8_t *public_key, uint16_t lock_count)
{
- uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key);
+ const uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key);
if (friend_num == UINT32_MAX) {
return -1;
}
- DHT_Friend *dht_friend = &dht->friends_list[friend_num];
+ DHT_Friend *const dht_friend = &dht->friends_list[friend_num];
--dht_friend->lock_count;
if (dht_friend->lock_count && lock_count) { /* DHT friend is still in use.*/
--lock_count;
- dht_friend->callbacks[lock_count].ip_callback = NULL;
- dht_friend->callbacks[lock_count].data = NULL;
+ dht_friend->callbacks[lock_count].ip_callback = nullptr;
+ dht_friend->callbacks[lock_count].data = nullptr;
dht_friend->callbacks[lock_count].number = 0;
return 0;
}
@@ -1501,13 +1590,13 @@ int DHT_delfriend(DHT *dht, const uint8_t *public_key, uint16_t lock_count)
if (dht->num_friends == 0) {
free(dht->friends_list);
- dht->friends_list = NULL;
+ dht->friends_list = nullptr;
return 0;
}
- DHT_Friend *temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends));
+ DHT_Friend *const temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends));
- if (temp == NULL) {
+ if (temp == nullptr) {
return -1;
}
@@ -1521,24 +1610,24 @@ int DHT_getfriendip(const DHT *dht, const uint8_t *public_key, IP_Port *ip_port)
ip_reset(&ip_port->ip);
ip_port->port = 0;
- uint32_t friend_index = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key);
+ const uint32_t friend_index = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key);
if (friend_index == UINT32_MAX) {
return -1;
}
- DHT_Friend *frnd = &dht->friends_list[friend_index];
- uint32_t client_index = index_of_client_pk(frnd->client_list, MAX_FRIEND_CLIENTS, public_key);
+ DHT_Friend *const frnd = &dht->friends_list[friend_index];
+ const uint32_t client_index = index_of_client_pk(frnd->client_list, MAX_FRIEND_CLIENTS, public_key);
if (client_index == -1) {
return 0;
}
- Client_data *client = &frnd->client_list[client_index];
- IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 };
+ const Client_data *const client = &frnd->client_list[client_index];
+ const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 };
for (size_t i = 0; i < ASSOC_COUNT; i++) {
- IPPTsPng *assoc = assocs[i];
+ const IPPTsPng *const assoc = assocs[i];
if (!is_timeout(assoc->timestamp, BAD_NODE_TIMEOUT)) {
*ip_port = assoc->ip_port;
@@ -1554,13 +1643,13 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co
Client_data *list, uint32_t list_count, uint32_t *bootstrap_times, bool sortable)
{
uint8_t not_kill = 0;
- uint64_t temp_time = unix_time();
+ const uint64_t temp_time = unix_time();
uint32_t num_nodes = 0;
VLA(Client_data *, client_list, list_count * 2);
VLA(IPPTsPng *, assoc_list, list_count * 2);
unsigned int sort = 0;
- bool sort_ok = 0;
+ bool sort_ok = false;
for (uint32_t i = 0; i < list_count; i++) {
/* If node is not dead. */
@@ -1568,15 +1657,15 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co
IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 };
- for (size_t i = 0; i < ASSOC_COUNT; i++) {
- IPPTsPng *assoc = assocs[i];
+ for (size_t j = 0; j < ASSOC_COUNT; j++) {
+ IPPTsPng *assoc = assocs[j];
if (!is_timeout(assoc->timestamp, KILL_NODE_TIMEOUT)) {
sort = 0;
not_kill++;
if (is_timeout(assoc->last_pinged, PING_INTERVAL)) {
- getnodes(dht, assoc->ip_port, client->public_key, public_key, NULL);
+ getnodes(dht, assoc->ip_port, client->public_key, public_key, nullptr);
assoc->last_pinged = temp_time;
}
@@ -1590,8 +1679,8 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co
++sort;
/* Timed out should be at beginning, if they are not, sort the list. */
- if (sort > 1 && sort < (((i + 1) * 2) - 1)) {
- sort_ok = 1;
+ if (sort > 1 && sort < (((j + 1) * 2) - 1)) {
+ sort_ok = true;
}
}
}
@@ -1602,13 +1691,13 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co
}
if ((num_nodes != 0) && (is_timeout(*lastgetnode, GET_NODE_INTERVAL) || *bootstrap_times < MAX_BOOTSTRAP_TIMES)) {
- uint32_t rand_node = rand() % (num_nodes);
+ uint32_t rand_node = rand() % num_nodes;
if ((num_nodes - 1) != rand_node) {
rand_node += rand() % (num_nodes - (rand_node + 1));
}
- getnodes(dht, assoc_list[rand_node]->ip_port, client_list[rand_node]->public_key, public_key, NULL);
+ getnodes(dht, assoc_list[rand_node]->ip_port, client_list[rand_node]->public_key, public_key, nullptr);
*lastgetnode = temp_time;
++*bootstrap_times;
@@ -1623,11 +1712,11 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co
static void do_DHT_friends(DHT *dht)
{
for (size_t i = 0; i < dht->num_friends; ++i) {
- DHT_Friend *dht_friend = &dht->friends_list[i];
+ DHT_Friend *const dht_friend = &dht->friends_list[i];
for (size_t j = 0; j < dht_friend->num_to_bootstrap; ++j) {
getnodes(dht, dht_friend->to_bootstrap[j].ip_port, dht_friend->to_bootstrap[j].public_key, dht_friend->public_key,
- NULL);
+ nullptr);
}
dht_friend->num_to_bootstrap = 0;
@@ -1644,34 +1733,37 @@ static void do_DHT_friends(DHT *dht)
static void do_Close(DHT *dht)
{
for (size_t i = 0; i < dht->num_to_bootstrap; ++i) {
- getnodes(dht, dht->to_bootstrap[i].ip_port, dht->to_bootstrap[i].public_key, dht->self_public_key, NULL);
+ getnodes(dht, dht->to_bootstrap[i].ip_port, dht->to_bootstrap[i].public_key, dht->self_public_key, nullptr);
}
dht->num_to_bootstrap = 0;
- uint8_t not_killed = do_ping_and_sendnode_requests(dht, &dht->close_lastgetnodes, dht->self_public_key,
- dht->close_clientlist, LCLIENT_LIST, &dht->close_bootstrap_times, 0);
+ uint8_t not_killed = do_ping_and_sendnode_requests(
+ dht, &dht->close_lastgetnodes, dht->self_public_key, dht->close_clientlist, LCLIENT_LIST, &dht->close_bootstrap_times,
+ 0);
+
+ if (not_killed != 0) {
+ return;
+ }
- if (!not_killed) {
- /* all existing nodes are at least KILL_NODE_TIMEOUT,
- * which means we are mute, as we only send packets to
- * nodes NOT in KILL_NODE_TIMEOUT
- *
- * so: reset all nodes to be BAD_NODE_TIMEOUT, but not
- * KILL_NODE_TIMEOUT, so we at least keep trying pings */
- uint64_t badonly = unix_time() - BAD_NODE_TIMEOUT;
+ /* all existing nodes are at least KILL_NODE_TIMEOUT,
+ * which means we are mute, as we only send packets to
+ * nodes NOT in KILL_NODE_TIMEOUT
+ *
+ * so: reset all nodes to be BAD_NODE_TIMEOUT, but not
+ * KILL_NODE_TIMEOUT, so we at least keep trying pings */
+ const uint64_t badonly = unix_time() - BAD_NODE_TIMEOUT;
- for (size_t i = 0; i < LCLIENT_LIST; i++) {
- Client_data *client = &dht->close_clientlist[i];
+ for (size_t i = 0; i < LCLIENT_LIST; i++) {
+ Client_data *const client = &dht->close_clientlist[i];
- IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 };
+ IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 };
- for (size_t j = 0; j < ASSOC_COUNT; j++) {
- IPPTsPng *assoc = assocs[j];
+ for (size_t j = 0; j < ASSOC_COUNT; j++) {
+ IPPTsPng *const assoc = assocs[j];
- if (assoc->timestamp) {
- assoc->timestamp = badonly;
- }
+ if (assoc->timestamp) {
+ assoc->timestamp = badonly;
}
}
}
@@ -1679,18 +1771,18 @@ static void do_Close(DHT *dht)
void DHT_getnodes(DHT *dht, const IP_Port *from_ipp, const uint8_t *from_id, const uint8_t *which_id)
{
- getnodes(dht, *from_ipp, from_id, which_id, NULL);
+ getnodes(dht, *from_ipp, from_id, which_id, nullptr);
}
void DHT_bootstrap(DHT *dht, IP_Port ip_port, const uint8_t *public_key)
{
- getnodes(dht, ip_port, public_key, dht->self_public_key, NULL);
+ getnodes(dht, ip_port, public_key, dht->self_public_key, nullptr);
}
int DHT_bootstrap_from_address(DHT *dht, const char *address, uint8_t ipv6enabled,
uint16_t port, const uint8_t *public_key)
{
IP_Port ip_port_v64;
- IP *ip_extra = NULL;
+ IP *ip_extra = nullptr;
IP_Port ip_port_v4;
ip_init(&ip_port_v64.ip, ipv6enabled);
@@ -1705,7 +1797,7 @@ int DHT_bootstrap_from_address(DHT *dht, const char *address, uint8_t ipv6enable
ip_port_v64.port = port;
DHT_bootstrap(dht, ip_port_v64, public_key);
- if ((ip_extra != NULL) && ip_isset(ip_extra)) {
+ if ((ip_extra != nullptr) && ip_isset(ip_extra)) {
ip_port_v4.port = port;
DHT_bootstrap(dht, ip_port_v4, public_key);
}
@@ -1724,11 +1816,11 @@ int route_packet(const DHT *dht, const uint8_t *public_key, const uint8_t *packe
{
for (uint32_t i = 0; i < LCLIENT_LIST; ++i) {
if (id_equal(public_key, dht->close_clientlist[i].public_key)) {
- const Client_data *client = &dht->close_clientlist[i];
- const IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 };
+ const Client_data *const client = &dht->close_clientlist[i];
+ const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 };
for (size_t j = 0; j < ASSOC_COUNT; j++) {
- const IPPTsPng *assoc = assocs[j];
+ const IPPTsPng *const assoc = assocs[j];
if (ip_isset(&assoc->ip_port.ip)) {
return sendpacket(dht->net, assoc->ip_port, packet, length);
@@ -1755,15 +1847,14 @@ static int friend_iplist(const DHT *dht, IP_Port *ip_portlist, uint16_t friend_n
return -1;
}
- DHT_Friend *dht_friend = &dht->friends_list[friend_num];
- Client_data *client;
+ const DHT_Friend *const dht_friend = &dht->friends_list[friend_num];
IP_Port ipv4s[MAX_FRIEND_CLIENTS];
int num_ipv4s = 0;
IP_Port ipv6s[MAX_FRIEND_CLIENTS];
int num_ipv6s = 0;
for (size_t i = 0; i < MAX_FRIEND_CLIENTS; ++i) {
- client = &dht_friend->client_list[i];
+ const Client_data *const client = &dht_friend->client_list[i];
/* If ip is not zero and node is good. */
if (ip_isset(&client->assoc4.ret_ip_port.ip) && !is_timeout(client->assoc4.ret_timestamp, BAD_NODE_TIMEOUT)) {
@@ -1824,7 +1915,7 @@ static int friend_iplist(const DHT *dht, IP_Port *ip_portlist, uint16_t friend_n
*/
int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *packet, uint16_t length)
{
- uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id);
+ const uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id);
if (num == UINT32_MAX) {
return 0;
@@ -1834,14 +1925,13 @@ int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *pack
uint8_t friend_sent[MAX_FRIEND_CLIENTS] = {0};
IP_Port ip_list[MAX_FRIEND_CLIENTS];
- int ip_num = friend_iplist(dht, ip_list, num);
+ const int ip_num = friend_iplist(dht, ip_list, num);
if (ip_num < (MAX_FRIEND_CLIENTS / 4)) {
return 0; /* Reason for that? */
}
- DHT_Friend *dht_friend = &dht->friends_list[num];
- Client_data *client;
+ const DHT_Friend *const dht_friend = &dht->friends_list[num];
/* extra legwork, because having the outside allocating the space for us
* is *usually* good(tm) (bites us in the behind in this case though) */
@@ -1851,16 +1941,15 @@ int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *pack
continue;
}
- client = &dht_friend->client_list[i];
-
- const IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 };
+ const Client_data *const client = &dht_friend->client_list[i];
+ const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 };
for (size_t j = 0; j < ASSOC_COUNT; j++) {
- const IPPTsPng *assoc = assocs[j];
+ const IPPTsPng *const assoc = assocs[j];
/* If ip is not zero and node is good. */
if (ip_isset(&assoc->ret_ip_port.ip) && !is_timeout(assoc->ret_timestamp, BAD_NODE_TIMEOUT)) {
- int retval = sendpacket(dht->net, assoc->ip_port, packet, length);
+ const int retval = sendpacket(dht->net, assoc->ip_port, packet, length);
if ((unsigned int)retval == length) {
++sent;
@@ -1879,14 +1968,13 @@ int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *pack
*/
static int routeone_tofriend(DHT *dht, const uint8_t *friend_id, const uint8_t *packet, uint16_t length)
{
- uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id);
+ const uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id);
if (num == UINT32_MAX) {
return 0;
}
- DHT_Friend *dht_friend = &dht->friends_list[num];
- Client_data *client;
+ const DHT_Friend *const dht_friend = &dht->friends_list[num];
IP_Port ip_list[MAX_FRIEND_CLIENTS * 2];
int n = 0;
@@ -1895,9 +1983,8 @@ static int routeone_tofriend(DHT *dht, const uint8_t *friend_id, const uint8_t *
* is *usually* good(tm) (bites us in the behind in this case though) */
for (uint32_t i = 0; i < MAX_FRIEND_CLIENTS; ++i) {
- client = &dht_friend->client_list[i];
-
- const IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 };
+ const Client_data *const client = &dht_friend->client_list[i];
+ const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 };
for (size_t j = 0; j < ASSOC_COUNT; j++) {
const IPPTsPng *assoc = assocs[j];
@@ -1914,7 +2001,7 @@ static int routeone_tofriend(DHT *dht, const uint8_t *friend_id, const uint8_t *
return 0;
}
- int retval = sendpacket(dht->net, ip_list[rand() % n], packet, length);
+ const int retval = sendpacket(dht->net, ip_list[rand() % n], packet, length);
if ((unsigned int)retval == length) {
return 1;
@@ -1936,8 +2023,9 @@ static int send_NATping(DHT *dht, const uint8_t *public_key, uint64_t ping_id, u
data[0] = type;
memcpy(data + 1, &ping_id, sizeof(uint64_t));
/* 254 is NAT ping request packet id */
- int len = create_request(dht->self_public_key, dht->self_secret_key, packet, public_key, data,
- sizeof(uint64_t) + 1, CRYPTO_PACKET_NAT_PING);
+ const int len = create_request(
+ dht->self_public_key, dht->self_secret_key, packet, public_key, data,
+ sizeof(uint64_t) + 1, CRYPTO_PACKET_NAT_PING);
if (len == -1) {
return -1;
@@ -1964,7 +2052,7 @@ static int handle_NATping(void *object, IP_Port source, const uint8_t *source_pu
return 1;
}
- DHT *dht = (DHT *)object;
+ DHT *const dht = (DHT *)object;
uint64_t ping_id;
memcpy(&ping_id, packet + 1, sizeof(uint64_t));
@@ -1974,7 +2062,7 @@ static int handle_NATping(void *object, IP_Port source, const uint8_t *source_pu
return 1;
}
- DHT_Friend *dht_friend = &dht->friends_list[friendnumber];
+ DHT_Friend *const dht_friend = &dht->friends_list[friendnumber];
if (packet[0] == NAT_PING_REQUEST) {
/* 1 is reply */
@@ -2056,7 +2144,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
return;
}
- uint16_t first_port = port_list[0];
+ const uint16_t first_port = port_list[0];
uint32_t i;
for (i = 0; i < numports; ++i) {
@@ -2073,11 +2161,11 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
} else {
for (i = 0; i < MAX_PUNCHING_PORTS; ++i) {
/* TODO(irungentoo): Improve port guessing algorithm. */
- uint32_t it = i + dht->friends_list[friend_num].nat.punching_index;
- int8_t sign = (it % 2) ? -1 : 1;
- uint32_t delta = sign * (it / (2 * numports));
- uint32_t index = (it / 2) % numports;
- uint16_t port = port_list[index] + delta;
+ const uint32_t it = i + dht->friends_list[friend_num].nat.punching_index;
+ const int8_t sign = (it % 2) ? -1 : 1;
+ const uint32_t delta = sign * (it / (2 * numports));
+ const uint32_t index = (it / 2) % numports;
+ const uint16_t port = port_list[index] + delta;
IP_Port pinging;
ip_copy(&pinging.ip, &ip);
pinging.port = net_htons(port);
@@ -2088,7 +2176,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
}
if (dht->friends_list[friend_num].nat.tries > MAX_NORMAL_PUNCHING_TRIES) {
- uint16_t port = 1024;
+ const uint16_t port = 1024;
IP_Port pinging;
ip_copy(&pinging.ip, &ip);
@@ -2106,11 +2194,11 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
static void do_NAT(DHT *dht)
{
- uint64_t temp_time = unix_time();
+ const uint64_t temp_time = unix_time();
for (uint32_t i = 0; i < dht->num_friends; ++i) {
IP_Port ip_list[MAX_FRIEND_CLIENTS];
- int num = friend_iplist(dht, ip_list, i);
+ const int num = friend_iplist(dht, ip_list, i);
/* If already connected or friend is not online don't try to hole punch. */
if (num < MAX_FRIEND_CLIENTS / 2) {
@@ -2126,7 +2214,7 @@ static void do_NAT(DHT *dht)
dht->friends_list[i].nat.punching_timestamp + PUNCH_INTERVAL < temp_time &&
dht->friends_list[i].nat.recvNATping_timestamp + PUNCH_INTERVAL * 2 >= temp_time) {
- IP ip = NAT_commonip(ip_list, num, MAX_FRIEND_CLIENTS / 2);
+ const IP ip = NAT_commonip(ip_list, num, MAX_FRIEND_CLIENTS / 2);
if (!ip_isset(&ip)) {
continue;
@@ -2139,7 +2227,7 @@ static void do_NAT(DHT *dht)
}
uint16_t port_list[MAX_FRIEND_CLIENTS];
- uint16_t numports = NAT_getports(port_list, ip_list, num, ip);
+ const uint16_t numports = NAT_getports(port_list, ip_list, num, ip);
punch_holes(dht, ip, port_list, numports, i);
dht->friends_list[i].nat.punching_timestamp = temp_time;
@@ -2151,14 +2239,17 @@ static void do_NAT(DHT *dht)
/*----------------------------------------------------------------------------------*/
/*-----------------------END OF NAT PUNCHING FUNCTIONS------------------------------*/
+#define DHT_HARDENING 0
#define HARDREQ_DATA_SIZE 384 /* Attempt to prevent amplification/other attacks*/
-#define CHECK_TYPE_ROUTE_REQ 0
-#define CHECK_TYPE_ROUTE_RES 1
-#define CHECK_TYPE_GETNODE_REQ 2
-#define CHECK_TYPE_GETNODE_RES 3
-#define CHECK_TYPE_TEST_REQ 4
-#define CHECK_TYPE_TEST_RES 5
+enum {
+ CHECK_TYPE_ROUTE_REQ = 0,
+ CHECK_TYPE_ROUTE_RES = 1,
+ CHECK_TYPE_GETNODE_REQ = 2,
+ CHECK_TYPE_GETNODE_RES = 3,
+ CHECK_TYPE_TEST_REQ = 4,
+ CHECK_TYPE_TEST_RES = 5,
+};
#if DHT_HARDENING
static int send_hardening_req(DHT *dht, Node_format *sendto, uint8_t type, uint8_t *contents, uint16_t length)
@@ -2171,8 +2262,9 @@ static int send_hardening_req(DHT *dht, Node_format *sendto, uint8_t type, uint8
uint8_t data[HARDREQ_DATA_SIZE] = {0};
data[0] = type;
memcpy(data + 1, contents, length);
- int len = create_request(dht->self_public_key, dht->self_secret_key, packet, sendto->public_key, data,
- sizeof(data), CRYPTO_PACKET_HARDENING);
+ const int len = create_request(
+ dht->self_public_key, dht->self_secret_key, packet, sendto->public_key,
+ data, sizeof(data), CRYPTO_PACKET_HARDENING);
if (len == -1) {
return -1;
@@ -2204,8 +2296,9 @@ static int send_hardening_getnode_res(const DHT *dht, const Node_format *sendto,
data[0] = CHECK_TYPE_GETNODE_RES;
memcpy(data + 1, queried_client_id, CRYPTO_PUBLIC_KEY_SIZE);
memcpy(data + 1 + CRYPTO_PUBLIC_KEY_SIZE, nodes_data, nodes_data_length);
- int len = create_request(dht->self_public_key, dht->self_secret_key, packet, sendto->public_key, data,
- SIZEOF_VLA(data), CRYPTO_PACKET_HARDENING);
+ const int len = create_request(
+ dht->self_public_key, dht->self_secret_key, packet, sendto->public_key,
+ data, SIZEOF_VLA(data), CRYPTO_PACKET_HARDENING);
if (len == -1) {
return -1;
@@ -2231,7 +2324,7 @@ static IPPTsPng *get_closelist_IPPTsPng(DHT *dht, const uint8_t *public_key, Fam
}
}
- return NULL;
+ return nullptr;
}
/*
@@ -2248,7 +2341,7 @@ static uint32_t have_nodes_closelist(DHT *dht, Node_format *nodes, uint16_t num)
continue;
}
- IPPTsPng *temp = get_closelist_IPPTsPng(dht, nodes[i].public_key, nodes[i].ip_port.ip.family);
+ const IPPTsPng *const temp = get_closelist_IPPTsPng(dht, nodes[i].public_key, nodes[i].ip_port.ip.family);
if (temp) {
if (!is_timeout(temp->timestamp, BAD_NODE_TIMEOUT)) {
@@ -2262,13 +2355,12 @@ static uint32_t have_nodes_closelist(DHT *dht, Node_format *nodes, uint16_t num)
/* Interval in seconds between hardening checks */
#define HARDENING_INTERVAL 120
-#define HARDEN_TIMEOUT 1200
/* Handle a received hardening packet */
static int handle_hardening(void *object, IP_Port source, const uint8_t *source_pubkey, const uint8_t *packet,
uint16_t length, void *userdata)
{
- DHT *dht = (DHT *)object;
+ DHT *const dht = (DHT *)object;
if (length < 2) {
return 1;
@@ -2303,7 +2395,8 @@ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_
uint16_t length_nodes = length - 1 - CRYPTO_PUBLIC_KEY_SIZE;
Node_format nodes[MAX_SENT_NODES];
- int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, 0, packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, length_nodes, 0);
+ const int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, nullptr, packet + 1 + CRYPTO_PUBLIC_KEY_SIZE,
+ length_nodes, 0);
/* TODO(irungentoo): MAX_SENT_NODES nodes should be returned at all times
(right now we have a small network size so it could cause problems for testing and etc..) */
@@ -2316,9 +2409,9 @@ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_
return 1;
}
- IPPTsPng *temp = get_closelist_IPPTsPng(dht, packet + 1, nodes[0].ip_port.ip.family);
+ IPPTsPng *const temp = get_closelist_IPPTsPng(dht, packet + 1, nodes[0].ip_port.ip.family);
- if (temp == NULL) {
+ if (temp == nullptr) {
return 1;
}
@@ -2340,6 +2433,8 @@ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_
}
#if DHT_HARDENING
+#define HARDEN_TIMEOUT 1200
+
/* Return a random node from all the nodes we are connected to.
* TODO(irungentoo): improve this function.
*/
@@ -2348,13 +2443,13 @@ static Node_format random_node(DHT *dht, Family sa_family)
uint8_t id[CRYPTO_PUBLIC_KEY_SIZE];
for (uint32_t i = 0; i < CRYPTO_PUBLIC_KEY_SIZE / 4; ++i) { /* populate the id with pseudorandom bytes.*/
- uint32_t t = rand();
+ const uint32_t t = rand();
memcpy(id + i * sizeof(t), &t, sizeof(t));
}
Node_format nodes_list[MAX_SENT_NODES];
memset(nodes_list, 0, sizeof(nodes_list));
- uint32_t num_nodes = get_close_nodes(dht, id, nodes_list, sa_family, 1, 0);
+ const uint32_t num_nodes = get_close_nodes(dht, id, nodes_list, sa_family, 1, 0);
if (num_nodes == 0) {
return nodes_list[0];
@@ -2377,21 +2472,21 @@ static uint16_t list_nodes(Client_data *list, size_t length, Node_format *nodes,
uint16_t count = 0;
for (size_t i = length; i != 0; --i) {
- IPPTsPng *assoc = NULL;
+ const IPPTsPng *assoc = nullptr;
if (!is_timeout(list[i - 1].assoc4.timestamp, BAD_NODE_TIMEOUT)) {
assoc = &list[i - 1].assoc4;
}
if (!is_timeout(list[i - 1].assoc6.timestamp, BAD_NODE_TIMEOUT)) {
- if (assoc == NULL) {
+ if (assoc == nullptr) {
assoc = &list[i - 1].assoc6;
} else if (rand() % 2) {
assoc = &list[i - 1].assoc6;
}
}
- if (assoc != NULL) {
+ if (assoc != nullptr) {
memcpy(nodes[count].public_key, list[i - 1].public_key, CRYPTO_PUBLIC_KEY_SIZE);
nodes[count].ip_port = assoc->ip_port;
++count;
@@ -2416,7 +2511,7 @@ uint16_t randfriends_nodes(DHT *dht, Node_format *nodes, uint16_t max_num)
}
uint16_t count = 0;
- unsigned int r = rand();
+ const unsigned int r = rand();
for (size_t i = 0; i < DHT_FAKE_FRIEND_NUMBER; ++i) {
count += list_nodes(dht->friends_list[(i + r) % DHT_FAKE_FRIEND_NUMBER].client_list, MAX_FRIEND_CLIENTS, nodes + count,
@@ -2443,9 +2538,9 @@ uint16_t closelist_nodes(DHT *dht, Node_format *nodes, uint16_t max_num)
static void do_hardening(DHT *dht)
{
for (uint32_t i = 0; i < LCLIENT_LIST * 2; ++i) {
- IPPTsPng *cur_iptspng;
+ IPPTsPng *cur_iptspng;
Family sa_family;
- uint8_t *public_key = dht->close_clientlist[i / 2].public_key;
+ const uint8_t *const public_key = dht->close_clientlist[i / 2].public_key;
if (i % 2 == 0) {
cur_iptspng = &dht->close_clientlist[i / 2].assoc4;
@@ -2502,7 +2597,7 @@ void cryptopacket_registerhandler(DHT *dht, uint8_t byte, cryptopacket_handler_c
static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata)
{
- DHT *dht = (DHT *)object;
+ DHT *const dht = (DHT *)object;
assert(packet[0] == NET_PACKET_CRYPTO);
@@ -2516,7 +2611,8 @@ static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *pack
uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE];
uint8_t data[MAX_CRYPTO_REQUEST_SIZE];
uint8_t number;
- int len = handle_request(dht->self_public_key, dht->self_secret_key, public_key, data, &number, packet, length);
+ const int len = handle_request(dht->self_public_key, dht->self_secret_key, public_key,
+ data, &number, packet, length);
if (len == -1 || len == 0) {
return 1;
@@ -2526,12 +2622,13 @@ static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *pack
return 1;
}
- return dht->cryptopackethandlers[number].function(dht->cryptopackethandlers[number].object, source, public_key,
- data, len, userdata);
+ return dht->cryptopackethandlers[number].function(
+ dht->cryptopackethandlers[number].object, source, public_key,
+ data, len, userdata);
}
/* If request is not for us, try routing it. */
- int retval = route_packet(dht, packet + 1, packet, length);
+ const int retval = route_packet(dht, packet + 1, packet, length);
if ((unsigned int)retval == length) {
return 0;
@@ -2547,14 +2644,14 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled)
/* init time */
unix_time_update();
- if (net == NULL) {
- return NULL;
+ if (net == nullptr) {
+ return nullptr;
}
- DHT *dht = (DHT *)calloc(1, sizeof(DHT));
+ DHT *const dht = (DHT *)calloc(1, sizeof(DHT));
- if (dht == NULL) {
- return NULL;
+ if (dht == nullptr) {
+ return nullptr;
}
dht->log = log;
@@ -2564,9 +2661,9 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled)
dht->ping = ping_new(dht);
- if (dht->ping == NULL) {
+ if (dht->ping == nullptr) {
kill_DHT(dht);
- return NULL;
+ return nullptr;
}
networking_registerhandler(dht->net, NET_PACKET_GET_NODES, &handle_getnodes, dht);
@@ -2575,7 +2672,6 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled)
cryptopacket_registerhandler(dht, CRYPTO_PACKET_NAT_PING, &handle_NATping, dht);
cryptopacket_registerhandler(dht, CRYPTO_PACKET_HARDENING, &handle_hardening, dht);
- new_symmetric_key(dht->secret_symmetric_key);
crypto_new_keypair(dht->self_public_key, dht->self_secret_key);
dht->dht_ping_array = ping_array_new(DHT_PING_ARRAY_SIZE, PING_TIMEOUT);
@@ -2585,9 +2681,9 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled)
uint8_t random_key_bytes[CRYPTO_PUBLIC_KEY_SIZE];
random_bytes(random_key_bytes, sizeof(random_key_bytes));
- if (DHT_addfriend(dht, random_key_bytes, 0, 0, 0, 0) != 0) {
+ if (DHT_addfriend(dht, random_key_bytes, nullptr, nullptr, 0, nullptr) != 0) {
kill_DHT(dht);
- return NULL;
+ return nullptr;
}
}
@@ -2616,12 +2712,13 @@ void do_DHT(DHT *dht)
#endif
dht->last_run = unix_time();
}
+
void kill_DHT(DHT *dht)
{
- networking_registerhandler(dht->net, NET_PACKET_GET_NODES, NULL, NULL);
- networking_registerhandler(dht->net, NET_PACKET_SEND_NODES_IPV6, NULL, NULL);
- cryptopacket_registerhandler(dht, CRYPTO_PACKET_NAT_PING, NULL, NULL);
- cryptopacket_registerhandler(dht, CRYPTO_PACKET_HARDENING, NULL, NULL);
+ networking_registerhandler(dht->net, NET_PACKET_GET_NODES, nullptr, nullptr);
+ networking_registerhandler(dht->net, NET_PACKET_SEND_NODES_IPV6, nullptr, nullptr);
+ cryptopacket_registerhandler(dht, CRYPTO_PACKET_NAT_PING, nullptr, nullptr);
+ cryptopacket_registerhandler(dht, CRYPTO_PACKET_HARDENING, nullptr, nullptr);
ping_array_kill(dht->dht_ping_array);
ping_array_kill(dht->dht_harden_ping_array);
ping_kill(dht->ping);
@@ -2642,7 +2739,8 @@ void kill_DHT(DHT *dht)
/* Get the size of the DHT (for saving). */
uint32_t DHT_size(const DHT *dht)
{
- uint32_t numv4 = 0, numv6 = 0;
+ uint32_t numv4 = 0;
+ uint32_t numv6 = 0;
for (uint32_t i = 0; i < LCLIENT_LIST; ++i) {
numv4 += (dht->close_clientlist[i].assoc4.timestamp != 0);
@@ -2650,7 +2748,7 @@ uint32_t DHT_size(const DHT *dht)
}
for (uint32_t i = 0; i < DHT_FAKE_FRIEND_NUMBER && i < dht->num_friends; ++i) {
- DHT_Friend *fr = &dht->friends_list[i];
+ const DHT_Friend *const fr = &dht->friends_list[i];
for (uint32_t j = 0; j < MAX_FRIEND_CLIENTS; ++j) {
numv4 += (fr->client_list[j].assoc4.timestamp != 0);
@@ -2658,7 +2756,8 @@ uint32_t DHT_size(const DHT *dht)
}
}
- uint32_t size32 = sizeof(uint32_t), sizesubhead = size32 * 2;
+ const uint32_t size32 = sizeof(uint32_t);
+ const uint32_t sizesubhead = size32 * 2;
return size32 + sizesubhead + (packed_node_size(TOX_AF_INET) * numv4) + (packed_node_size(TOX_AF_INET6) * numv6);
}
@@ -2674,12 +2773,12 @@ static uint8_t *DHT_save_subheader(uint8_t *data, uint32_t len, uint16_t type)
/* Save the DHT in data where data is an array of size DHT_size(). */
-void DHT_save(DHT *dht, uint8_t *data)
+void DHT_save(const DHT *dht, uint8_t *data)
{
host_to_lendian32(data, DHT_STATE_COOKIE_GLOBAL);
data += sizeof(uint32_t);
- uint8_t *old_data = data;
+ uint8_t *const old_data = data;
/* get right offset. we write the actual header later. */
data = DHT_save_subheader(data, 0, 0);
@@ -2703,7 +2802,7 @@ void DHT_save(DHT *dht, uint8_t *data)
}
for (uint32_t i = 0; i < DHT_FAKE_FRIEND_NUMBER && i < dht->num_friends; ++i) {
- DHT_Friend *fr = &dht->friends_list[i];
+ const DHT_Friend *const fr = &dht->friends_list[i];
for (uint32_t j = 0; j < MAX_FRIEND_CLIENTS; ++j) {
if (fr->client_list[j].assoc4.timestamp != 0) {
@@ -2729,7 +2828,7 @@ void DHT_save(DHT *dht, uint8_t *data)
/* Start sending packets after DHT loaded_friends_list and loaded_clients_list are set */
int DHT_connect_after_load(DHT *dht)
{
- if (dht == NULL) {
+ if (dht == nullptr) {
return -1;
}
@@ -2740,13 +2839,13 @@ int DHT_connect_after_load(DHT *dht)
/* DHT is connected, stop. */
if (DHT_non_lan_connected(dht)) {
free(dht->loaded_nodes_list);
- dht->loaded_nodes_list = NULL;
+ dht->loaded_nodes_list = nullptr;
dht->loaded_num_nodes = 0;
return 0;
}
for (uint32_t i = 0; i < dht->loaded_num_nodes && i < SAVE_BOOTSTAP_FREQUENCY; ++i) {
- unsigned int index = dht->loaded_nodes_index % dht->loaded_num_nodes;
+ const unsigned int index = dht->loaded_nodes_index % dht->loaded_num_nodes;
DHT_bootstrap(dht, dht->loaded_nodes_list[index].ip_port, dht->loaded_nodes_list[index].public_key);
++dht->loaded_nodes_index;
}
@@ -2759,26 +2858,25 @@ static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t le
DHT *dht = (DHT *)outer;
switch (type) {
- case DHT_STATE_TYPE_NODES:
+ case DHT_STATE_TYPE_NODES: {
if (length == 0) {
break;
}
- {
- free(dht->loaded_nodes_list);
- // Copy to loaded_clients_list
- dht->loaded_nodes_list = (Node_format *)calloc(MAX_SAVED_DHT_NODES, sizeof(Node_format));
+ free(dht->loaded_nodes_list);
+ // Copy to loaded_clients_list
+ dht->loaded_nodes_list = (Node_format *)calloc(MAX_SAVED_DHT_NODES, sizeof(Node_format));
- int num = unpack_nodes(dht->loaded_nodes_list, MAX_SAVED_DHT_NODES, NULL, data, length, 0);
+ const int num = unpack_nodes(dht->loaded_nodes_list, MAX_SAVED_DHT_NODES, nullptr, data, length, 0);
- if (num > 0) {
- dht->loaded_num_nodes = num;
- } else {
- dht->loaded_num_nodes = 0;
- }
- } /* localize declarations */
+ if (num > 0) {
+ dht->loaded_num_nodes = num;
+ } else {
+ dht->loaded_num_nodes = 0;
+ }
break;
+ }
default:
LOGGER_ERROR(dht->log, "Load state (DHT): contains unrecognized part (len %u, type %u)\n",
@@ -2796,7 +2894,7 @@ static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t le
*/
int DHT_load(DHT *dht, const uint8_t *data, uint32_t length)
{
- uint32_t cookie_len = sizeof(uint32_t);
+ const uint32_t cookie_len = sizeof(uint32_t);
if (length > cookie_len) {
uint32_t data32;
@@ -2811,43 +2909,43 @@ int DHT_load(DHT *dht, const uint8_t *data, uint32_t length)
return -1;
}
-/* return 0 if we are not connected to the DHT.
- * return 1 if we are.
+/* return false if we are not connected to the DHT.
+ * return true if we are.
*/
-int DHT_isconnected(const DHT *dht)
+bool DHT_isconnected(const DHT *dht)
{
unix_time_update();
for (uint32_t i = 0; i < LCLIENT_LIST; ++i) {
- const Client_data *client = &dht->close_clientlist[i];
+ const Client_data *const client = &dht->close_clientlist[i];
if (!is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) ||
!is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT)) {
- return 1;
+ return true;
}
}
- return 0;
+ return false;
}
-/* return 0 if we are not connected or only connected to lan peers with the DHT.
- * return 1 if we are.
+/* return false if we are not connected or only connected to lan peers with the DHT.
+ * return true if we are.
*/
-int DHT_non_lan_connected(const DHT *dht)
+bool DHT_non_lan_connected(const DHT *dht)
{
unix_time_update();
for (uint32_t i = 0; i < LCLIENT_LIST; ++i) {
- const Client_data *client = &dht->close_clientlist[i];
+ const Client_data *const client = &dht->close_clientlist[i];
if (!is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) && ip_is_lan(client->assoc4.ip_port.ip) == -1) {
- return 1;
+ return true;
}
if (!is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT) && ip_is_lan(client->assoc6.ip_port.ip) == -1) {
- return 1;
+ return true;
}
}
- return 0;
+ return false;
}
diff --git a/protocols/Tox/libtox/src/toxcore/DHT.h b/protocols/Tox/libtox/src/toxcore/DHT.h
index 8fdd80b04d..284aa8c02f 100644
--- a/protocols/Tox/libtox/src/toxcore/DHT.h
+++ b/protocols/Tox/libtox/src/toxcore/DHT.h
@@ -240,42 +240,22 @@ typedef struct {
} Cryptopacket_Handles;
#define DHT_DEFINED
-typedef struct DHT {
- Logger *log;
- Networking_Core *net;
+typedef struct DHT DHT;
- bool hole_punching_enabled;
+const uint8_t *dht_get_self_public_key(const DHT *dht);
+const uint8_t *dht_get_self_secret_key(const DHT *dht);
+void dht_set_self_public_key(DHT *dht, const uint8_t *key);
+void dht_set_self_secret_key(DHT *dht, const uint8_t *key);
- Client_data close_clientlist[LCLIENT_LIST];
- uint64_t close_lastgetnodes;
- uint32_t close_bootstrap_times;
+Networking_Core *dht_get_net(const DHT *dht);
+struct Ping *dht_get_ping(const DHT *dht);
+const Client_data *dht_get_close_clientlist(const DHT *dht);
+const Client_data *dht_get_close_client(const DHT *dht, uint32_t client_num);
+uint16_t dht_get_num_friends(const DHT *dht);
- /* Note: this key should not be/is not used to transmit any sensitive materials */
- uint8_t secret_symmetric_key[CRYPTO_SYMMETRIC_KEY_SIZE];
- /* DHT keypair */
- uint8_t self_public_key[CRYPTO_PUBLIC_KEY_SIZE];
- uint8_t self_secret_key[CRYPTO_SECRET_KEY_SIZE];
+DHT_Friend *dht_get_friend(DHT *dht, uint32_t friend_num);
+const uint8_t *dht_get_friend_public_key(const DHT *dht, uint32_t friend_num);
- DHT_Friend *friends_list;
- uint16_t num_friends;
-
- Node_format *loaded_nodes_list;
- uint32_t loaded_num_nodes;
- unsigned int loaded_nodes_index;
-
- Shared_Keys shared_keys_recv;
- Shared_Keys shared_keys_sent;
-
- struct Ping *ping;
- Ping_Array *dht_ping_array;
- Ping_Array *dht_harden_ping_array;
- uint64_t last_run;
-
- Cryptopacket_Handles cryptopackethandlers[256];
-
- Node_format to_bootstrap[MAX_CLOSE_TO_BOOTSTRAP_NODES];
- unsigned int num_to_bootstrap;
-} DHT;
/*----------------------------------------------------------------------------------*/
/* Shared key generations are costly, it is therefor smart to store commonly used
@@ -433,7 +413,7 @@ void cryptopacket_registerhandler(DHT *dht, uint8_t byte, cryptopacket_handler_c
uint32_t DHT_size(const DHT *dht);
/* Save the DHT in data where data is an array of size DHT_size(). */
-void DHT_save(DHT *dht, uint8_t *data);
+void DHT_save(const DHT *dht, uint8_t *data);
/* Load the DHT from data of size size.
*
@@ -447,15 +427,15 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled);
void kill_DHT(DHT *dht);
-/* return 0 if we are not connected to the DHT.
- * return 1 if we are.
+/* return false if we are not connected to the DHT.
+ * return true if we are.
*/
-int DHT_isconnected(const DHT *dht);
+bool DHT_isconnected(const DHT *dht);
-/* return 0 if we are not connected or only connected to lan peers with the DHT.
- * return 1 if we are.
+/* return false if we are not connected or only connected to lan peers with the DHT.
+ * return true if we are.
*/
-int DHT_non_lan_connected(const DHT *dht);
+bool DHT_non_lan_connected(const DHT *dht);
uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key);
diff --git a/protocols/Tox/libtox/src/toxcore/LAN_discovery.c b/protocols/Tox/libtox/src/toxcore/LAN_discovery.c
index b5cf2c525b..70b71fea02 100644
--- a/protocols/Tox/libtox/src/toxcore/LAN_discovery.c
+++ b/protocols/Tox/libtox/src/toxcore/LAN_discovery.c
@@ -29,12 +29,6 @@
#include "util.h"
-/* Used for get_broadcast(). */
-#ifdef __linux
-#include <linux/netdevice.h>
-#include <sys/ioctl.h>
-#endif
-
#define MAX_INTERFACES 16
@@ -52,7 +46,7 @@ static void fetch_broadcast_info(uint16_t port)
IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
unsigned long ulOutBufLen = sizeof(IP_ADAPTER_INFO);
- if (pAdapterInfo == NULL) {
+ if (pAdapterInfo == nullptr) {
return;
}
@@ -60,7 +54,7 @@ static void fetch_broadcast_info(uint16_t port)
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
- if (pAdapterInfo == NULL) {
+ if (pAdapterInfo == nullptr) {
return;
}
}
@@ -85,9 +79,9 @@ static void fetch_broadcast_info(uint16_t port)
if (gateway.family == TOX_AF_INET && subnet_mask.family == TOX_AF_INET) {
IP_Port *ip_port = &ip_ports[count];
ip_port->ip.family = TOX_AF_INET;
- uint32_t gateway_ip = net_ntohl(gateway.ip4.uint32), subnet_ip = net_ntohl(subnet_mask.ip4.uint32);
+ uint32_t gateway_ip = net_ntohl(gateway.ip.v4.uint32), subnet_ip = net_ntohl(subnet_mask.ip.v4.uint32);
uint32_t broadcast_ip = gateway_ip + ~subnet_ip - 1;
- ip_port->ip.ip4.uint32 = net_htonl(broadcast_ip);
+ ip_port->ip.ip.v4.uint32 = net_htonl(broadcast_ip);
ip_port->port = port;
count++;
@@ -112,7 +106,17 @@ static void fetch_broadcast_info(uint16_t port)
}
}
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__FreeBSD__)
+
+#ifdef __linux__
+#include <linux/netdevice.h>
+#endif
+
+#ifdef __FreeBSD__
+#include <net/if.h>
+#endif
+
+#include <sys/ioctl.h>
static void fetch_broadcast_info(uint16_t port)
{
@@ -121,9 +125,9 @@ static void fetch_broadcast_info(uint16_t port)
* Definitely won't work like this on Windows...
*/
broadcast_count = 0;
- Socket sock = 0;
+ const Socket sock = net_socket(TOX_AF_INET, TOX_SOCK_STREAM, 0);
- if ((sock = net_socket(TOX_AF_INET, TOX_SOCK_STREAM, 0)) < 0) {
+ if (sock < 0) {
return;
}
@@ -152,9 +156,9 @@ static void fetch_broadcast_info(uint16_t port)
* a larger array, not done (640kB and 16 interfaces shall be
* enough, for everybody!)
*/
- int i, n = ifconf.ifc_len / sizeof(struct ifreq);
+ int n = ifconf.ifc_len / sizeof(struct ifreq);
- for (i = 0; i < n; i++) {
+ for (int i = 0; i < n; i++) {
/* there are interfaces with are incapable of broadcast */
if (ioctl(sock, SIOCGIFBRDADDR, &i_faces[i]) < 0) {
continue;
@@ -173,9 +177,9 @@ static void fetch_broadcast_info(uint16_t port)
IP_Port *ip_port = &ip_ports[count];
ip_port->ip.family = TOX_AF_INET;
- ip_port->ip.ip4.uint32 = sock4->sin_addr.s_addr;
+ ip_port->ip.ip.v4.uint32 = sock4->sin_addr.s_addr;
- if (ip_port->ip.ip4.uint32 == 0) {
+ if (ip_port->ip.ip.v4.uint32 == 0) {
continue;
}
@@ -217,9 +221,7 @@ static uint32_t send_broadcasts(Networking_Core *net, uint16_t port, const uint8
return 0;
}
- int i;
-
- for (i = 0; i < broadcast_count; i++) {
+ for (int i = 0; i < broadcast_count; i++) {
sendpacket(net, broadcast_ip_ports[i], data, length);
}
@@ -238,17 +240,17 @@ static IP broadcast_ip(Family family_socket, Family family_broadcast)
/* FF02::1 is - according to RFC 4291 - multicast all-nodes link-local */
/* FE80::*: MUST be exact, for that we would need to look over all
* interfaces and check in which status they are */
- ip.ip6.uint8[ 0] = 0xFF;
- ip.ip6.uint8[ 1] = 0x02;
- ip.ip6.uint8[15] = 0x01;
+ ip.ip.v6.uint8[ 0] = 0xFF;
+ ip.ip.v6.uint8[ 1] = 0x02;
+ ip.ip.v6.uint8[15] = 0x01;
} else if (family_broadcast == TOX_AF_INET) {
ip.family = TOX_AF_INET6;
- ip.ip6 = IP6_BROADCAST;
+ ip.ip.v6 = IP6_BROADCAST;
}
} else if (family_socket == TOX_AF_INET) {
if (family_broadcast == TOX_AF_INET) {
ip.family = TOX_AF_INET;
- ip.ip4 = IP4_BROADCAST;
+ ip.ip.v4 = IP4_BROADCAST;
}
}
@@ -259,7 +261,7 @@ static IP broadcast_ip(Family family_socket, Family family_broadcast)
bool ip_is_local(IP ip)
{
if (ip.family == TOX_AF_INET) {
- IP4 ip4 = ip.ip4;
+ IP4 ip4 = ip.ip.v4;
/* Loopback. */
if (ip4.uint8[0] == 127) {
@@ -267,15 +269,15 @@ bool ip_is_local(IP ip)
}
} else {
/* embedded IPv4-in-IPv6 */
- if (IPV6_IPV4_IN_V6(ip.ip6)) {
+ if (IPV6_IPV4_IN_V6(ip.ip.v6)) {
IP ip4;
ip4.family = TOX_AF_INET;
- ip4.ip4.uint32 = ip.ip6.uint32[3];
+ ip4.ip.v4.uint32 = ip.ip.v6.uint32[3];
return ip_is_local(ip4);
}
/* localhost in IPv6 (::1) */
- if (ip.ip6.uint64[0] == 0 && ip.ip6.uint32[2] == 0 && ip.ip6.uint32[3] == net_htonl(1)) {
+ if (ip.ip.v6.uint64[0] == 0 && ip.ip.v6.uint32[2] == 0 && ip.ip.v6.uint32[3] == net_htonl(1)) {
return 1;
}
}
@@ -293,7 +295,7 @@ int ip_is_lan(IP ip)
}
if (ip.family == TOX_AF_INET) {
- IP4 ip4 = ip.ip4;
+ IP4 ip4 = ip.ip.v4;
/* 10.0.0.0 to 10.255.255.255 range. */
if (ip4.uint8[0] == 10) {
@@ -325,16 +327,16 @@ int ip_is_lan(IP ip)
/* autogenerated for each interface: FE80::* (up to FEBF::*)
FF02::1 is - according to RFC 4291 - multicast all-nodes link-local */
- if (((ip.ip6.uint8[0] == 0xFF) && (ip.ip6.uint8[1] < 3) && (ip.ip6.uint8[15] == 1)) ||
- ((ip.ip6.uint8[0] == 0xFE) && ((ip.ip6.uint8[1] & 0xC0) == 0x80))) {
+ if (((ip.ip.v6.uint8[0] == 0xFF) && (ip.ip.v6.uint8[1] < 3) && (ip.ip.v6.uint8[15] == 1)) ||
+ ((ip.ip.v6.uint8[0] == 0xFE) && ((ip.ip.v6.uint8[1] & 0xC0) == 0x80))) {
return 0;
}
/* embedded IPv4-in-IPv6 */
- if (IPV6_IPV4_IN_V6(ip.ip6)) {
+ if (IPV6_IPV4_IN_V6(ip.ip.v6)) {
IP ip4;
ip4.family = TOX_AF_INET;
- ip4.ip4.uint32 = ip.ip6.uint32[3];
+ ip4.ip.v4.uint32 = ip.ip.v6.uint32[3];
return ip_is_lan(ip4);
}
}
@@ -346,6 +348,9 @@ static int handle_LANdiscovery(void *object, IP_Port source, const uint8_t *pack
{
DHT *dht = (DHT *)object;
+ char ip_str[IP_NTOA_LEN] = { 0 };
+ ip_ntoa(&source.ip, ip_str, sizeof(ip_str));
+
if (ip_is_lan(source.ip) == -1) {
return 1;
}
@@ -354,10 +359,6 @@ static int handle_LANdiscovery(void *object, IP_Port source, const uint8_t *pack
return 1;
}
- char ip_str[IP_NTOA_LEN] = { 0 };
- ip_ntoa(&source.ip, ip_str, sizeof(ip_str));
- LOGGER_DEBUG(dht->log, "Found node in LAN: %s", ip_str);
-
DHT_bootstrap(dht, source, packet + 1);
return 0;
}
@@ -367,30 +368,30 @@ int lan_discovery_send(uint16_t port, DHT *dht)
{
uint8_t data[CRYPTO_PUBLIC_KEY_SIZE + 1];
data[0] = NET_PACKET_LAN_DISCOVERY;
- id_copy(data + 1, dht->self_public_key);
+ id_copy(data + 1, dht_get_self_public_key(dht));
- send_broadcasts(dht->net, port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE);
+ send_broadcasts(dht_get_net(dht), port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE);
int res = -1;
IP_Port ip_port;
ip_port.port = port;
/* IPv6 multicast */
- if (net_family(dht->net) == TOX_AF_INET6) {
+ if (net_family(dht_get_net(dht)) == TOX_AF_INET6) {
ip_port.ip = broadcast_ip(TOX_AF_INET6, TOX_AF_INET6);
if (ip_isset(&ip_port.ip)) {
- if (sendpacket(dht->net, ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE) > 0) {
+ if (sendpacket(dht_get_net(dht), ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE) > 0) {
res = 1;
}
}
}
/* IPv4 broadcast (has to be IPv4-in-IPv6 mapping if socket is TOX_AF_INET6 */
- ip_port.ip = broadcast_ip(net_family(dht->net), TOX_AF_INET);
+ ip_port.ip = broadcast_ip(net_family(dht_get_net(dht)), TOX_AF_INET);
if (ip_isset(&ip_port.ip)) {
- if (sendpacket(dht->net, ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE)) {
+ if (sendpacket(dht_get_net(dht), ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE)) {
res = 1;
}
}
@@ -401,10 +402,10 @@ int lan_discovery_send(uint16_t port, DHT *dht)
void lan_discovery_init(DHT *dht)
{
- networking_registerhandler(dht->net, NET_PACKET_LAN_DISCOVERY, &handle_LANdiscovery, dht);
+ networking_registerhandler(dht_get_net(dht), NET_PACKET_LAN_DISCOVERY, &handle_LANdiscovery, dht);
}
void lan_discovery_kill(DHT *dht)
{
- networking_registerhandler(dht->net, NET_PACKET_LAN_DISCOVERY, NULL, NULL);
+ networking_registerhandler(dht_get_net(dht), NET_PACKET_LAN_DISCOVERY, nullptr, nullptr);
}
diff --git a/protocols/Tox/libtox/src/toxcore/Messenger.c b/protocols/Tox/libtox/src/toxcore/Messenger.c
index fcee455ccc..6e209f4db3 100644
--- a/protocols/Tox/libtox/src/toxcore/Messenger.c
+++ b/protocols/Tox/libtox/src/toxcore/Messenger.c
@@ -33,7 +33,6 @@
#include <assert.h>
-static void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status, void *userdata);
static int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_t packet_id, const uint8_t *data,
uint32_t length, uint8_t congestion_control);
@@ -57,13 +56,13 @@ static int realloc_friendlist(Messenger *m, uint32_t num)
{
if (num == 0) {
free(m->friendlist);
- m->friendlist = NULL;
+ m->friendlist = nullptr;
return 0;
}
Friend *newfriendlist = (Friend *)realloc(m->friendlist, num * sizeof(Friend));
- if (newfriendlist == NULL) {
+ if (newfriendlist == nullptr) {
return -1;
}
@@ -322,8 +321,8 @@ static int clear_receipts(Messenger *m, int32_t friendnumber)
receipts = temp_r;
}
- m->friendlist[friendnumber].receipts_start = NULL;
- m->friendlist[friendnumber].receipts_end = NULL;
+ m->friendlist[friendnumber].receipts_start = nullptr;
+ m->friendlist[friendnumber].receipts_end = nullptr;
return 0;
}
@@ -349,7 +348,7 @@ static int add_receipt(Messenger *m, int32_t friendnumber, uint32_t packet_num,
}
m->friendlist[friendnumber].receipts_end = new_receipts;
- new_receipts->next = NULL;
+ new_receipts->next = nullptr;
return 0;
}
/*
@@ -393,7 +392,7 @@ static int do_receipts(Messenger *m, int32_t friendnumber, void *userdata)
}
if (!m->friendlist[friendnumber].receipts_start) {
- m->friendlist[friendnumber].receipts_end = NULL;
+ m->friendlist[friendnumber].receipts_end = nullptr;
}
return 0;
@@ -416,7 +415,8 @@ int m_delfriend(Messenger *m, int32_t friendnumber)
clear_receipts(m, friendnumber);
remove_request_received(m->fr, m->friendlist[friendnumber].real_pk);
- friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, 0, 0, 0, 0, 0);
+ friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, nullptr,
+ nullptr, nullptr, nullptr, 0);
if (friend_con_connected(m->fr_c, m->friendlist[friendnumber].friendcon_id) == FRIENDCONN_STATUS_CONNECTED) {
send_offline_packet(m, m->friendlist[friendnumber].friendcon_id);
@@ -488,8 +488,7 @@ int m_friend_exists(const Messenger *m, int32_t friendnumber)
int m_send_message_generic(Messenger *m, int32_t friendnumber, uint8_t type, const uint8_t *message, uint32_t length,
uint32_t *message_id)
{
- /* MESSAGE_LAST itself is incorrect value */
- if (type >= MESSAGE_LAST) {
+ if (type > MESSAGE_ACTION) {
return -5;
}
@@ -601,7 +600,7 @@ int setname(Messenger *m, const uint8_t *name, uint16_t length)
*/
uint16_t getself_name(const Messenger *m, uint8_t *name)
{
- if (name == NULL) {
+ if (name == nullptr) {
return 0;
}
@@ -949,7 +948,7 @@ static void check_friend_connectionstatus(Messenger *m, int32_t friendnumber, ui
}
}
-void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status, void *userdata)
+static void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status, void *userdata)
{
check_friend_connectionstatus(m, friendnumber, status, userdata);
m->friendlist[friendnumber].status = status;
@@ -1283,7 +1282,7 @@ int file_control(const Messenger *m, int32_t friendnumber, uint32_t filenumber,
}
}
- if (send_file_control_packet(m, friendnumber, send_receive, file_number, control, 0, 0)) {
+ if (send_file_control_packet(m, friendnumber, send_receive, file_number, control, nullptr, 0)) {
if (control == FILECONTROL_KILL) {
ft->status = FILESTATUS_NONE;
@@ -1482,119 +1481,159 @@ uint64_t file_dataremaining(const Messenger *m, int32_t friendnumber, uint8_t fi
return 0;
}
+ const struct File_Transfers *const sending = &m->friendlist[friendnumber].file_sending[filenumber];
+
if (send_receive == 0) {
- if (m->friendlist[friendnumber].file_sending[filenumber].status == FILESTATUS_NONE) {
+ if (sending->status == FILESTATUS_NONE) {
return 0;
}
- return m->friendlist[friendnumber].file_sending[filenumber].size -
- m->friendlist[friendnumber].file_sending[filenumber].transferred;
+ return sending->size - sending->transferred;
}
- if (m->friendlist[friendnumber].file_receiving[filenumber].status == FILESTATUS_NONE) {
+ const struct File_Transfers *const receiving = &m->friendlist[friendnumber].file_receiving[filenumber];
+
+ if (receiving->status == FILESTATUS_NONE) {
return 0;
}
- return m->friendlist[friendnumber].file_receiving[filenumber].size -
- m->friendlist[friendnumber].file_receiving[filenumber].transferred;
+ return receiving->size - receiving->transferred;
}
-static void do_reqchunk_filecb(Messenger *m, int32_t friendnumber, void *userdata)
+/**
+ * Iterate over all file transfers and request chunks (from the client) for each
+ * of them.
+ *
+ * The free_slots parameter is updated by this function.
+ *
+ * @param m Our messenger object.
+ * @param friendnumber The friend we're sending files to.
+ * @param userdata The client userdata to pass along to chunk request callbacks.
+ * @param free_slots A pointer to the number of free send queue slots in the
+ * crypto connection.
+ *
+ * @return true if there are still file transfers ongoing, false if all file
+ * transfers are complete.
+ */
+static bool do_all_filetransfers(Messenger *m, int32_t friendnumber, void *userdata, uint32_t *free_slots)
{
- if (!m->friendlist[friendnumber].num_sending_files) {
- return;
- }
+ Friend *const friendcon = &m->friendlist[friendnumber];
+ uint32_t num = friendcon->num_sending_files;
- int free_slots = crypto_num_free_sendqueue_slots(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c,
- m->friendlist[friendnumber].friendcon_id));
+ bool any_active_fts = false;
- if (free_slots < MIN_SLOTS_FREE) {
- free_slots = 0;
- } else {
- free_slots -= MIN_SLOTS_FREE;
- }
-
- unsigned int i, num = m->friendlist[friendnumber].num_sending_files;
-
- for (i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) {
- struct File_Transfers *ft = &m->friendlist[friendnumber].file_sending[i];
+ // Iterate over all file transfers, including inactive ones. I.e. we always
+ // iterate exactly MAX_CONCURRENT_FILE_PIPES times.
+ for (uint32_t i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) {
+ struct File_Transfers *const ft = &friendcon->file_sending[i];
+ // Any status other than NONE means the file transfer is active.
if (ft->status != FILESTATUS_NONE) {
+ any_active_fts = true;
--num;
- if (ft->status == FILESTATUS_FINISHED) {
- /* Check if file was entirely sent. */
- if (friend_received_packet(m, friendnumber, ft->last_packet_number) == 0) {
- if (m->file_reqchunk) {
- (*m->file_reqchunk)(m, friendnumber, i, ft->transferred, 0, userdata);
- }
-
- ft->status = FILESTATUS_NONE;
- --m->friendlist[friendnumber].num_sending_files;
+ // If the file transfer is complete, we request a chunk of size 0.
+ if (ft->status == FILESTATUS_FINISHED && friend_received_packet(m, friendnumber, ft->last_packet_number) == 0) {
+ if (m->file_reqchunk) {
+ m->file_reqchunk(m, friendnumber, i, ft->transferred, 0, userdata);
}
- }
- /* TODO(irungentoo): if file is too slow, switch to the next. */
- if (ft->slots_allocated > (unsigned int)free_slots) {
- free_slots = 0;
- } else {
- free_slots -= ft->slots_allocated;
+ // Now it's inactive, we're no longer sending this.
+ ft->status = FILESTATUS_NONE;
+ --friendcon->num_sending_files;
}
+
+ // Decrease free slots by the number of slots this FT uses.
+ *free_slots = max_s32(0, (int32_t) * free_slots - ft->slots_allocated);
}
- while (ft->status == FILESTATUS_TRANSFERRING && (ft->paused == FILE_PAUSE_NOT)) {
- if (max_speed_reached(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c,
- m->friendlist[friendnumber].friendcon_id))) {
- free_slots = 0;
+ if (ft->status == FILESTATUS_TRANSFERRING && ft->paused == FILE_PAUSE_NOT) {
+ if (max_speed_reached(m->net_crypto, friend_connection_crypt_connection_id(
+ m->fr_c, friendcon->friendcon_id))) {
+ *free_slots = 0;
}
- if (free_slots == 0) {
- break;
+ if (*free_slots == 0) {
+ continue;
}
- uint16_t length = MAX_FILE_DATA_SIZE;
-
if (ft->size == 0) {
/* Send 0 data to friend if file is 0 length. */
- file_data(m, friendnumber, i, 0, 0, 0);
- break;
+ file_data(m, friendnumber, i, 0, nullptr, 0);
+ continue;
}
if (ft->size == ft->requested) {
- break;
- }
-
- if (ft->size - ft->requested < length) {
- length = ft->size - ft->requested;
+ // This file transfer is done.
+ continue;
}
- ++ft->slots_allocated;
+ // Allocate 1 slot to this file transfer.
+ ft->slots_allocated++;
- uint64_t position = ft->requested;
+ const uint16_t length = min_u64(ft->size - ft->requested, MAX_FILE_DATA_SIZE);
+ const uint64_t position = ft->requested;
ft->requested += length;
if (m->file_reqchunk) {
- (*m->file_reqchunk)(m, friendnumber, i, position, length, userdata);
+ m->file_reqchunk(m, friendnumber, i, position, length, userdata);
}
- --free_slots;
+ // The allocated slot is no longer free.
+ --*free_slots;
}
if (num == 0) {
- break;
+ continue;
}
}
+
+ return any_active_fts;
+}
+
+static void do_reqchunk_filecb(Messenger *m, int32_t friendnumber, void *userdata)
+{
+ // We're not currently doing any file transfers.
+ if (m->friendlist[friendnumber].num_sending_files == 0) {
+ return;
+ }
+
+ // The number of packet slots left in the sendbuffer.
+ // This is a per friend count (CRYPTO_PACKET_BUFFER_SIZE).
+ uint32_t free_slots = crypto_num_free_sendqueue_slots(
+ m->net_crypto,
+ friend_connection_crypt_connection_id(
+ m->fr_c,
+ m->friendlist[friendnumber].friendcon_id));
+
+ // We keep MIN_SLOTS_FREE slots free for other packets, otherwise file
+ // transfers might block other traffic for a long time.
+ free_slots = max_s32(0, (int32_t)free_slots - MIN_SLOTS_FREE);
+
+ bool any_active_fts = true;
+ uint32_t loop_counter = 0;
+ // Maximum number of outer loops below. If the client doesn't send file
+ // chunks from within the chunk request callback handler, we never realise
+ // that the file transfer has finished and may end up in an infinite loop.
+ //
+ // TODO(zoff99): Fix this to exit the loop properly when we're done
+ // requesting all chunks for all file transfers.
+ const uint32_t MAX_FT_LOOPS = 16;
+
+ while (((free_slots > 0) || loop_counter == 0) && any_active_fts && (loop_counter < MAX_FT_LOOPS)) {
+ any_active_fts = do_all_filetransfers(m, friendnumber, userdata, &free_slots);
+ loop_counter++;
+ }
}
+
/* Run this when the friend disconnects.
* Kill all current file transfers.
*/
static void break_files(const Messenger *m, int32_t friendnumber)
{
- uint32_t i;
-
// TODO(irungentoo): Inform the client which file transfers get killed with a callback?
- for (i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) {
+ for (uint32_t i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) {
if (m->friendlist[friendnumber].file_sending[i].status != FILESTATUS_NONE) {
m->friendlist[friendnumber].file_sending[i].status = FILESTATUS_NONE;
}
@@ -1619,7 +1658,7 @@ static struct File_Transfers *get_file_transfer(uint8_t receive_send, uint8_t fi
}
if (ft->status == FILESTATUS_NONE) {
- return NULL;
+ return nullptr;
}
return ft;
@@ -1639,10 +1678,10 @@ static int handle_filecontrol(Messenger *m, int32_t friendnumber, uint8_t receiv
uint32_t real_filenumber;
struct File_Transfers *ft = get_file_transfer(receive_send, filenumber, &real_filenumber, &m->friendlist[friendnumber]);
- if (ft == NULL) {
+ if (ft == nullptr) {
LOGGER_DEBUG(m->log, "file control (friend %d, file %d): file transfer does not exist; telling the other to kill it",
friendnumber, filenumber);
- send_file_control_packet(m, friendnumber, !receive_send, filenumber, FILECONTROL_KILL, 0, 0);
+ send_file_control_packet(m, friendnumber, !receive_send, filenumber, FILECONTROL_KILL, nullptr, 0);
return -1;
}
@@ -1785,13 +1824,13 @@ static int m_handle_custom_lossy_packet(void *object, int friend_num, const uint
return 1;
}
-void custom_lossy_packet_registerhandler(Messenger *m, void (*packet_handler_callback)(Messenger *m,
+void custom_lossy_packet_registerhandler(Messenger *m, void (*lossy_packethandler)(Messenger *m,
uint32_t friendnumber, const uint8_t *data, size_t len, void *object))
{
- m->lossy_packethandler = packet_handler_callback;
+ m->lossy_packethandler = lossy_packethandler;
}
-int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, int (*packet_handler_callback)(Messenger *m,
+int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, int (*function)(Messenger *m,
uint32_t friendnumber, const uint8_t *data, uint16_t len, void *object), void *object)
{
if (friend_not_valid(m, friendnumber)) {
@@ -1806,8 +1845,7 @@ int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, int
return -1;
}
- m->friendlist[friendnumber].lossy_rtp_packethandlers[byte % PACKET_LOSSY_AV_RESERVED].function =
- packet_handler_callback;
+ m->friendlist[friendnumber].lossy_rtp_packethandlers[byte % PACKET_LOSSY_AV_RESERVED].function = function;
m->friendlist[friendnumber].lossy_rtp_packethandlers[byte % PACKET_LOSSY_AV_RESERVED].object = object;
return 0;
}
@@ -1867,10 +1905,10 @@ static int handle_custom_lossless_packet(void *object, int friend_num, const uin
return 1;
}
-void custom_lossless_packet_registerhandler(Messenger *m, void (*packet_handler_callback)(Messenger *m,
+void custom_lossless_packet_registerhandler(Messenger *m, void (*lossless_packethandler)(Messenger *m,
uint32_t friendnumber, const uint8_t *data, size_t len, void *object))
{
- m->lossless_packethandler = packet_handler_callback;
+ m->lossless_packethandler = lossless_packethandler;
}
int send_custom_lossless_packet(const Messenger *m, int32_t friendnumber, const uint8_t *data, uint32_t length)
@@ -1919,7 +1957,7 @@ static int friend_already_added(const uint8_t *real_pk, void *data)
Messenger *new_messenger(Messenger_Options *options, unsigned int *error)
{
if (!options) {
- return NULL;
+ return nullptr;
}
if (error) {
@@ -1929,22 +1967,22 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error)
Messenger *m = (Messenger *)calloc(1, sizeof(Messenger));
if (!m) {
- return NULL;
+ return nullptr;
}
m->fr = friendreq_new();
if (!m->fr) {
free(m);
- return NULL;
+ return nullptr;
}
- Logger *log = NULL;
+ Logger *log = nullptr;
if (options->log_callback) {
log = logger_new();
- if (log != NULL) {
+ if (log != nullptr) {
logger_callback_log(log, options->log_callback, m, options->log_user_data);
}
}
@@ -1961,34 +1999,37 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error)
m->net = new_networking_ex(log, ip, options->port_range[0], options->port_range[1], &net_err);
}
- if (m->net == NULL) {
+ if (m->net == nullptr) {
friendreq_kill(m->fr);
+ logger_kill(m->log);
free(m);
if (error && net_err == 1) {
*error = MESSENGER_ERROR_PORT;
}
- return NULL;
+ return nullptr;
}
m->dht = new_DHT(m->log, m->net, options->hole_punching_enabled);
- if (m->dht == NULL) {
+ if (m->dht == nullptr) {
kill_networking(m->net);
friendreq_kill(m->fr);
+ logger_kill(m->log);
free(m);
- return NULL;
+ return nullptr;
}
m->net_crypto = new_net_crypto(m->log, m->dht, &options->proxy_info);
- if (m->net_crypto == NULL) {
+ if (m->net_crypto == nullptr) {
kill_networking(m->net);
kill_DHT(m->dht);
friendreq_kill(m->fr);
+ logger_kill(m->log);
free(m);
- return NULL;
+ return nullptr;
}
m->onion = new_onion(m->dht);
@@ -2005,14 +2046,16 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error)
kill_DHT(m->dht);
kill_networking(m->net);
friendreq_kill(m->fr);
+ logger_kill(m->log);
free(m);
- return NULL;
+ return nullptr;
}
if (options->tcp_server_port) {
- m->tcp_server = new_TCP_server(options->ipv6enabled, 1, &options->tcp_server_port, m->dht->self_secret_key, m->onion);
+ m->tcp_server = new_TCP_server(options->ipv6enabled, 1, &options->tcp_server_port, dht_get_self_secret_key(m->dht),
+ m->onion);
- if (m->tcp_server == NULL) {
+ if (m->tcp_server == nullptr) {
kill_friend_connections(m->fr_c);
kill_onion(m->onion);
kill_onion_announce(m->onion_a);
@@ -2021,13 +2064,14 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error)
kill_DHT(m->dht);
kill_networking(m->net);
friendreq_kill(m->fr);
+ logger_kill(m->log);
free(m);
if (error) {
*error = MESSENGER_ERROR_TCP_SERVER;
}
- return NULL;
+ return nullptr;
}
}
@@ -2214,8 +2258,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
}
case PACKET_ID_MESSAGE: // fall-through
- case PACKET_ID_ACTION:
- case PACKET_ID_CORRECTION: {
+ case PACKET_ID_ACTION: {
if (data_length == 0) {
break;
}
@@ -2257,10 +2300,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
uint8_t filenumber = data[0];
+#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES
+
if (filenumber >= MAX_CONCURRENT_FILE_PIPES) {
break;
}
+#endif
+
uint64_t filesize;
uint32_t file_type;
uint16_t filename_length = data_length - head_length;
@@ -2287,7 +2334,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
memcpy(ft->id, data + 1 + sizeof(uint32_t) + sizeof(uint64_t), FILE_ID_LENGTH);
VLA(uint8_t, filename_terminated, filename_length + 1);
- uint8_t *filename = NULL;
+ uint8_t *filename = nullptr;
if (filename_length) {
/* Force NULL terminate file name. */
@@ -2317,10 +2364,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
uint8_t filenumber = data[1];
uint8_t control_type = data[2];
+#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES
+
if (filenumber >= MAX_CONCURRENT_FILE_PIPES) {
break;
}
+#endif
+
if (handle_filecontrol(m, i, send_receive, filenumber, control_type, data + 3, data_length - 3, userdata) == -1) {
// TODO(iphydf): Do something different here? Right now, this
// check is pointless.
@@ -2337,10 +2388,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
uint8_t filenumber = data[0];
+#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES
+
if (filenumber >= MAX_CONCURRENT_FILE_PIPES) {
break;
}
+#endif
+
struct File_Transfers *ft = &m->friendlist[i].file_receiving[filenumber];
if (ft->status != FILESTATUS_TRANSFERRING) {
@@ -2355,7 +2410,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
const uint8_t *file_data;
if (file_data_length == 0) {
- file_data = NULL;
+ file_data = nullptr;
} else {
file_data = data + 1;
}
@@ -2373,7 +2428,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
if (file_data_length && (ft->transferred >= ft->size || file_data_length != MAX_FILE_DATA_SIZE)) {
file_data_length = 0;
- file_data = NULL;
+ file_data = nullptr;
position = ft->transferred;
/* Full file received. */
@@ -2467,7 +2522,7 @@ static void do_friends(Messenger *m, void *userdata)
do_receipts(m, i, userdata);
do_reqchunk_filecb(m, i, userdata);
- m->friendlist[i].last_seen_time = (uint64_t) time(NULL);
+ m->friendlist[i].last_seen_time = (uint64_t) time(nullptr);
}
}
}
@@ -2543,7 +2598,7 @@ void do_messenger(Messenger *m, void *userdata)
IP_Port local_ip_port;
local_ip_port.port = m->options.tcp_server_port;
local_ip_port.ip.family = TOX_AF_INET;
- local_ip_port.ip.ip4 = get_ip4_loopback();
+ local_ip_port.ip.ip.v4 = get_ip4_loopback();
add_tcp_relay(m->net_crypto, local_ip_port,
tcp_server_public_key(m->tcp_server));
}
@@ -2571,8 +2626,8 @@ void do_messenger(Messenger *m, void *userdata)
uint32_t client, last_pinged;
for (client = 0; client < LCLIENT_LIST; client++) {
- Client_data *cptr = &m->dht->close_clientlist[client];
- IPPTsPng *assoc = NULL;
+ const Client_data *cptr = dht_get_close_client(m->dht, client);
+ const IPPTsPng *assoc = nullptr;
uint32_t a;
for (a = 0, assoc = &cptr->assoc4; a < 2; a++, assoc = &cptr->assoc6) {
@@ -2597,7 +2652,7 @@ void do_messenger(Messenger *m, void *userdata)
uint32_t friend_idx, dhtfriend;
/* dht contains additional "friends" (requests) */
- uint32_t num_dhtfriends = m->dht->num_friends;
+ uint32_t num_dhtfriends = dht_get_num_friends(m->dht);
VLA(int32_t, m2dht, num_dhtfriends);
VLA(int32_t, dht2m, num_dhtfriends);
@@ -2609,8 +2664,8 @@ void do_messenger(Messenger *m, void *userdata)
continue;
}
- for (dhtfriend = 0; dhtfriend < m->dht->num_friends; dhtfriend++) {
- if (id_equal(m->friendlist[friend_idx].real_pk, m->dht->friends_list[dhtfriend].public_key)) {
+ for (dhtfriend = 0; dhtfriend < dht_get_num_friends(m->dht); dhtfriend++) {
+ if (id_equal(m->friendlist[friend_idx].real_pk, dht_get_friend_public_key(m->dht, dhtfriend))) {
m2dht[friend_idx] = dhtfriend;
break;
}
@@ -2623,8 +2678,8 @@ void do_messenger(Messenger *m, void *userdata)
}
}
- if (m->numfriends != m->dht->num_friends) {
- LOGGER_TRACE(m->log, "Friend num in DHT %u != friend num in msger %u\n", m->dht->num_friends, m->numfriends);
+ if (m->numfriends != dht_get_num_friends(m->dht)) {
+ LOGGER_TRACE(m->log, "Friend num in DHT %u != friend num in msger %u\n", dht_get_num_friends(m->dht), m->numfriends);
}
Friend *msgfptr;
@@ -2634,10 +2689,10 @@ void do_messenger(Messenger *m, void *userdata)
if (dht2m[friend_idx] >= 0) {
msgfptr = &m->friendlist[dht2m[friend_idx]];
} else {
- msgfptr = NULL;
+ msgfptr = nullptr;
}
- dhtfptr = &m->dht->friends_list[friend_idx];
+ dhtfptr = dht_get_friend(m->dht, friend_idx);
if (msgfptr) {
char id_str[IDSTRING_LEN];
@@ -2652,7 +2707,7 @@ void do_messenger(Messenger *m, void *userdata)
for (client = 0; client < MAX_FRIEND_CLIENTS; client++) {
Client_data *cptr = &dhtfptr->client_list[client];
- IPPTsPng *assoc = NULL;
+ IPPTsPng *assoc = nullptr;
uint32_t a;
for (a = 0, assoc = &cptr->assoc4; a < 2; a++, assoc = &cptr->assoc6) {
@@ -2708,13 +2763,13 @@ struct SAVED_FRIEND {
uint64_t last_seen_time;
};
-static uint32_t friend_size()
+static uint32_t friend_size(void)
{
uint32_t data = 0;
- const struct SAVED_FRIEND temp = { 0 };
+ const struct SAVED_FRIEND *const temp = nullptr;
-#define VALUE_MEMBER(NAME) data += sizeof(temp.NAME)
-#define ARRAY_MEMBER(NAME) data += sizeof(temp.NAME)
+#define VALUE_MEMBER(NAME) data += sizeof(temp->NAME)
+#define ARRAY_MEMBER(NAME) data += sizeof(temp->NAME)
// Exactly the same in friend_load, friend_save, and friend_size
VALUE_MEMBER(status);
@@ -3061,7 +3116,7 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3
break;
}
- unpack_nodes(m->loaded_relays, NUM_SAVED_TCP_RELAYS, 0, data, length, 1);
+ unpack_nodes(m->loaded_relays, NUM_SAVED_TCP_RELAYS, nullptr, data, length, 1);
m->has_added_relays = 0;
break;
@@ -3074,7 +3129,7 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3
break;
}
- int i, num = unpack_nodes(nodes, NUM_SAVED_PATH_NODES, 0, data, length, 0);
+ int i, num = unpack_nodes(nodes, NUM_SAVED_PATH_NODES, nullptr, data, length, 0);
for (i = 0; i < num; ++i) {
onion_add_bs_path_node(m->onion_c, nodes[i].ip_port, nodes[i].public_key);
diff --git a/protocols/Tox/libtox/src/toxcore/Messenger.h b/protocols/Tox/libtox/src/toxcore/Messenger.h
index a261a507db..402eb91650 100644
--- a/protocols/Tox/libtox/src/toxcore/Messenger.h
+++ b/protocols/Tox/libtox/src/toxcore/Messenger.h
@@ -37,14 +37,16 @@
/* This cannot be bigger than 256 */
#define MAX_CONCURRENT_FILE_PIPES 256
+#if !defined(__SPLINT__) && MAX_CONCURRENT_FILE_PIPES > UINT8_MAX + 1
+#error "uint8_t cannot represent all file transfer numbers"
+#endif
+
#define FRIEND_ADDRESS_SIZE (CRYPTO_PUBLIC_KEY_SIZE + sizeof(uint32_t) + sizeof(uint16_t))
enum {
MESSAGE_NORMAL,
- MESSAGE_ACTION,
- MESSAGE_CORRECTION,
- MESSAGE_LAST
+ MESSAGE_ACTION
};
/* NOTE: Packet ids below 24 must never be used. */
@@ -56,7 +58,6 @@ enum {
#define PACKET_ID_TYPING 51
#define PACKET_ID_MESSAGE 64
#define PACKET_ID_ACTION (PACKET_ID_MESSAGE + MESSAGE_ACTION) /* 65 */
-#define PACKET_ID_CORRECTION (PACKET_ID_MESSAGE + MESSAGE_CORRECTION) /* 66 */
#define PACKET_ID_MSI 69
#define PACKET_ID_FILE_SENDREQUEST 80
#define PACKET_ID_FILE_CONTROL 81
@@ -73,13 +74,13 @@ enum {
#define PACKET_LOSSY_AV_RESERVED 8 /* Number of lossy packet types at start of range reserved for A/V. */
typedef struct {
- uint8_t ipv6enabled;
- uint8_t udp_disabled;
+ bool ipv6enabled;
+ bool udp_disabled;
TCP_Proxy_Info proxy_info;
uint16_t port_range[2];
uint16_t tcp_server_port;
- uint8_t hole_punching_enabled;
+ bool hole_punching_enabled;
bool local_discovery_enabled;
logger_cb *log_callback;
@@ -205,7 +206,7 @@ typedef struct {
uint64_t last_seen_time;
uint8_t last_connection_udp_tcp;
struct File_Transfers file_sending[MAX_CONCURRENT_FILE_PIPES];
- unsigned int num_sending_files;
+ uint32_t num_sending_files;
struct File_Transfers file_receiving[MAX_CONCURRENT_FILE_PIPES];
struct {
diff --git a/protocols/Tox/libtox/src/toxcore/TCP_client.c b/protocols/Tox/libtox/src/toxcore/TCP_client.c
index b4092f803d..a6c32f9c64 100644
--- a/protocols/Tox/libtox/src/toxcore/TCP_client.c
+++ b/protocols/Tox/libtox/src/toxcore/TCP_client.c
@@ -110,9 +110,9 @@ void tcp_con_set_custom_object(TCP_Client_Connection *con, void *object)
{
con->custom_object = object;
}
-void tcp_con_set_custom_uint(TCP_Client_Connection *con, uint32_t uint)
+void tcp_con_set_custom_uint(TCP_Client_Connection *con, uint32_t value)
{
- con->custom_uint = uint;
+ con->custom_uint = value;
}
/* return 1 on success
@@ -230,12 +230,12 @@ static void proxy_socks5_generate_connection_request(TCP_Client_Connection *TCP_
if (TCP_conn->ip_port.ip.family == TOX_AF_INET) {
TCP_conn->last_packet[3] = 1; /* IPv4 address */
++length;
- memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip4.uint8, sizeof(IP4));
+ memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip.v4.uint8, sizeof(IP4));
length += sizeof(IP4);
} else {
TCP_conn->last_packet[3] = 4; /* IPv6 address */
++length;
- memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip6.uint8, sizeof(IP6));
+ memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip.v6.uint8, sizeof(IP6));
length += sizeof(IP6);
}
@@ -382,7 +382,7 @@ static int client_send_pending_data(TCP_Client_Connection *con)
con->priority_queue_start = p;
if (!p) {
- con->priority_queue_end = NULL;
+ con->priority_queue_end = nullptr;
return 0;
}
@@ -401,7 +401,7 @@ static bool client_add_priority(TCP_Client_Connection *con, const uint8_t *packe
return 0;
}
- new_list->next = NULL;
+ new_list->next = nullptr;
new_list->size = size;
new_list->sent = sent;
memcpy(new_list->data, packet, size);
@@ -694,16 +694,16 @@ TCP_Client_Connection *new_TCP_connection(IP_Port ip_port, const uint8_t *public
const uint8_t *self_secret_key, TCP_Proxy_Info *proxy_info)
{
if (networking_at_startup() != 0) {
- return NULL;
+ return nullptr;
}
if (ip_port.ip.family != TOX_AF_INET && ip_port.ip.family != TOX_AF_INET6) {
- return NULL;
+ return nullptr;
}
TCP_Proxy_Info default_proxyinfo;
- if (proxy_info == NULL) {
+ if (proxy_info == nullptr) {
default_proxyinfo.proxy_type = TCP_PROXY_NONE;
proxy_info = &default_proxyinfo;
}
@@ -717,24 +717,24 @@ TCP_Client_Connection *new_TCP_connection(IP_Port ip_port, const uint8_t *public
Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP);
if (!sock_valid(sock)) {
- return NULL;
+ return nullptr;
}
if (!set_socket_nosigpipe(sock)) {
kill_sock(sock);
- return 0;
+ return nullptr;
}
if (!(set_socket_nonblock(sock) && connect_sock_to(sock, ip_port, proxy_info))) {
kill_sock(sock);
- return NULL;
+ return nullptr;
}
TCP_Client_Connection *temp = (TCP_Client_Connection *)calloc(sizeof(TCP_Client_Connection), 1);
- if (temp == NULL) {
+ if (temp == nullptr) {
kill_sock(sock);
- return NULL;
+ return nullptr;
}
temp->sock = sock;
@@ -761,7 +761,7 @@ TCP_Client_Connection *new_TCP_connection(IP_Port ip_port, const uint8_t *public
if (generate_handshake(temp) == -1) {
kill_sock(sock);
free(temp);
- return NULL;
+ return nullptr;
}
break;
@@ -1062,7 +1062,7 @@ void do_TCP_connection(TCP_Client_Connection *TCP_connection, void *userdata)
*/
void kill_TCP_connection(TCP_Client_Connection *TCP_connection)
{
- if (TCP_connection == NULL) {
+ if (TCP_connection == nullptr) {
return;
}
diff --git a/protocols/Tox/libtox/src/toxcore/TCP_connection.c b/protocols/Tox/libtox/src/toxcore/TCP_connection.c
index a43069da68..d10114f625 100644
--- a/protocols/Tox/libtox/src/toxcore/TCP_connection.c
+++ b/protocols/Tox/libtox/src/toxcore/TCP_connection.c
@@ -72,13 +72,28 @@ const uint8_t *tcp_connections_public_key(const TCP_Connections *tcp_c)
* return -1 if realloc fails.
* return 0 if it succeeds.
*/
-#define realloc_tox_array(array, element_type, num, temp_pointer) \
- (num \
- ? (temp_pointer = (element_type *)realloc( \
- array, \
- (num) * sizeof(element_type)), \
- temp_pointer ? (array = temp_pointer, 0) : -1) \
- : (free(array), array = NULL, 0))
+#define MAKE_REALLOC(T) \
+static int realloc_##T(T **array, size_t num) \
+{ \
+ if (!num) { \
+ free(*array); \
+ *array = nullptr; \
+ return 0; \
+ } \
+ \
+ T *temp_pointer = (T *)realloc(*array, num * sizeof(T)); \
+ \
+ if (!temp_pointer) { \
+ return -1; \
+ } \
+ \
+ *array = temp_pointer; \
+ \
+ return 0; \
+}
+
+MAKE_REALLOC(TCP_Connection_to)
+MAKE_REALLOC(TCP_con)
/* return 1 if the connections_number is not valid.
@@ -90,7 +105,7 @@ static bool connections_number_not_valid(const TCP_Connections *tcp_c, int conne
return 1;
}
- if (tcp_c->connections == NULL) {
+ if (tcp_c->connections == nullptr) {
return 1;
}
@@ -110,7 +125,7 @@ static bool tcp_connections_number_not_valid(const TCP_Connections *tcp_c, int t
return 1;
}
- if (tcp_c->tcp_connections == NULL) {
+ if (tcp_c->tcp_connections == nullptr) {
return 1;
}
@@ -138,10 +153,7 @@ static int create_connection(TCP_Connections *tcp_c)
int id = -1;
- TCP_Connection_to *temp_pointer;
-
- if (realloc_tox_array(tcp_c->connections, TCP_Connection_to, tcp_c->connections_length + 1,
- temp_pointer) == 0) {
+ if (realloc_TCP_Connection_to(&tcp_c->connections, tcp_c->connections_length + 1) == 0) {
id = tcp_c->connections_length;
++tcp_c->connections_length;
memset(&tcp_c->connections[id], 0, sizeof(TCP_Connection_to));
@@ -167,9 +179,7 @@ static int create_tcp_connection(TCP_Connections *tcp_c)
int id = -1;
- TCP_con *temp_pointer;
-
- if (realloc_tox_array(tcp_c->tcp_connections, TCP_con, tcp_c->tcp_connections_length + 1, temp_pointer) == 0) {
+ if (realloc_TCP_con(&tcp_c->tcp_connections, tcp_c->tcp_connections_length + 1) == 0) {
id = tcp_c->tcp_connections_length;
++tcp_c->tcp_connections_length;
memset(&tcp_c->tcp_connections[id], 0, sizeof(TCP_con));
@@ -200,8 +210,7 @@ static int wipe_connection(TCP_Connections *tcp_c, int connections_number)
if (tcp_c->connections_length != i) {
tcp_c->connections_length = i;
- TCP_Connection_to *temp_pointer;
- realloc_tox_array(tcp_c->connections, TCP_Connection_to, tcp_c->connections_length, temp_pointer);
+ realloc_TCP_Connection_to(&tcp_c->connections, tcp_c->connections_length);
}
return 0;
@@ -229,8 +238,7 @@ static int wipe_tcp_connection(TCP_Connections *tcp_c, int tcp_connections_numbe
if (tcp_c->tcp_connections_length != i) {
tcp_c->tcp_connections_length = i;
- TCP_con *temp_pointer;
- realloc_tox_array(tcp_c->tcp_connections, TCP_con, tcp_c->tcp_connections_length, temp_pointer);
+ realloc_TCP_con(&tcp_c->tcp_connections, tcp_c->tcp_connections_length);
}
return 0;
@@ -239,7 +247,7 @@ static int wipe_tcp_connection(TCP_Connections *tcp_c, int tcp_connections_numbe
static TCP_Connection_to *get_connection(const TCP_Connections *tcp_c, int connections_number)
{
if (connections_number_not_valid(tcp_c, connections_number)) {
- return 0;
+ return nullptr;
}
return &tcp_c->connections[connections_number];
@@ -248,7 +256,7 @@ static TCP_Connection_to *get_connection(const TCP_Connections *tcp_c, int conne
static TCP_con *get_tcp_connection(const TCP_Connections *tcp_c, int tcp_connections_number)
{
if (tcp_connections_number_not_valid(tcp_c, tcp_connections_number)) {
- return 0;
+ return nullptr;
}
return &tcp_c->tcp_connections[tcp_connections_number];
@@ -824,7 +832,7 @@ static int sleep_tcp_relay_connection(TCP_Connections *tcp_c, int tcp_connection
memcpy(tcp_con->relay_pk, tcp_con_public_key(tcp_con->connection), CRYPTO_PUBLIC_KEY_SIZE);
kill_TCP_connection(tcp_con->connection);
- tcp_con->connection = NULL;
+ tcp_con->connection = nullptr;
unsigned int i;
@@ -922,7 +930,7 @@ static int tcp_response_callback(void *object, uint8_t connection_id, const uint
TCP_Connection_to *con_to = get_connection(tcp_c, connections_number);
- if (con_to == NULL) {
+ if (con_to == nullptr) {
return -1;
}
@@ -1368,14 +1376,14 @@ int set_tcp_onion_status(TCP_Connections *tcp_c, bool status)
*/
TCP_Connections *new_tcp_connections(const uint8_t *secret_key, TCP_Proxy_Info *proxy_info)
{
- if (secret_key == NULL) {
- return NULL;
+ if (secret_key == nullptr) {
+ return nullptr;
}
TCP_Connections *temp = (TCP_Connections *)calloc(1, sizeof(TCP_Connections));
- if (temp == NULL) {
- return NULL;
+ if (temp == nullptr) {
+ return nullptr;
}
memcpy(temp->self_secret_key, secret_key, CRYPTO_SECRET_KEY_SIZE);
@@ -1400,7 +1408,7 @@ static void do_tcp_conns(TCP_Connections *tcp_c, void *userdata)
tcp_con = get_tcp_connection(tcp_c, i);
// Make sure the TCP connection wasn't dropped in any of the callbacks.
- assert(tcp_con != NULL);
+ assert(tcp_con != nullptr);
if (tcp_con_status(tcp_con->connection) == TCP_CLIENT_DISCONNECTED) {
if (tcp_con->status == TCP_CONN_CONNECTED) {
diff --git a/protocols/Tox/libtox/src/toxcore/TCP_server.c b/protocols/Tox/libtox/src/toxcore/TCP_server.c
index e86776e59e..4541fce0ce 100644
--- a/protocols/Tox/libtox/src/toxcore/TCP_server.c
+++ b/protocols/Tox/libtox/src/toxcore/TCP_server.c
@@ -98,9 +98,11 @@ size_t tcp_server_listen_count(const TCP_Server *tcp_server)
/* This is needed to compile on Android below API 21
*/
+#ifdef TCP_SERVER_USE_EPOLL
#ifndef EPOLLRDHUP
#define EPOLLRDHUP 0x2000
#endif
+#endif
/* Set the size of the connection list to numfriends.
*
@@ -111,7 +113,7 @@ static int realloc_connection(TCP_Server *TCP_server, uint32_t num)
{
if (num == 0) {
free(TCP_server->accepted_connection_array);
- TCP_server->accepted_connection_array = NULL;
+ TCP_server->accepted_connection_array = nullptr;
TCP_server->size_accepted_connections = 0;
return 0;
}
@@ -124,7 +126,7 @@ static int realloc_connection(TCP_Server *TCP_server, uint32_t num)
TCP_server->accepted_connection_array,
num * sizeof(TCP_Secure_Connection));
- if (new_connections == NULL) {
+ if (new_connections == nullptr) {
return -1;
}
@@ -403,7 +405,7 @@ static int send_pending_data(TCP_Secure_Connection *con)
con->priority_queue_start = p;
if (!p) {
- con->priority_queue_end = NULL;
+ con->priority_queue_end = nullptr;
return 0;
}
@@ -422,7 +424,7 @@ static bool add_priority(TCP_Secure_Connection *con, const uint8_t *packet, uint
return 0;
}
- new_list->next = NULL;
+ new_list->next = nullptr;
new_list->size = size;
new_list->sent = sent;
memcpy(new_list->data, packet, size);
@@ -788,7 +790,7 @@ static int rm_connection_index(TCP_Server *TCP_server, TCP_Secure_Connection *co
static int handle_onion_recv_1(void *object, IP_Port dest, const uint8_t *data, uint16_t length)
{
TCP_Server *TCP_server = (TCP_Server *)object;
- uint32_t index = dest.ip.ip6.uint32[0];
+ uint32_t index = dest.ip.ip.v6.uint32[0];
if (index >= TCP_server->size_accepted_connections) {
return 1;
@@ -796,7 +798,7 @@ static int handle_onion_recv_1(void *object, IP_Port dest, const uint8_t *data,
TCP_Secure_Connection *con = &TCP_server->accepted_connection_array[index];
- if (con->identifier != dest.ip.ip6.uint64[1]) {
+ if (con->identifier != dest.ip.ip.v6.uint64[1]) {
return 1;
}
@@ -896,9 +898,9 @@ static int handle_TCP_packet(TCP_Server *TCP_server, uint32_t con_id, const uint
IP_Port source;
source.port = 0; // dummy initialise
source.ip.family = TCP_ONION_FAMILY;
- source.ip.ip6.uint32[0] = con_id;
- source.ip.ip6.uint32[1] = 0;
- source.ip.ip6.uint64[1] = con->identifier;
+ source.ip.ip.v6.uint32[0] = con_id;
+ source.ip.ip.v6.uint32[1] = 0;
+ source.ip.ip.v6.uint64[1] = con->identifier;
onion_send_1(TCP_server->onion, data + 1 + CRYPTO_NONCE_SIZE, length - (1 + CRYPTO_NONCE_SIZE), source,
data + 1);
}
@@ -1034,25 +1036,25 @@ static Socket new_listening_TCP_socket(int family, uint16_t port)
TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uint16_t *ports, const uint8_t *secret_key,
Onion *onion)
{
- if (num_sockets == 0 || ports == NULL) {
- return NULL;
+ if (num_sockets == 0 || ports == nullptr) {
+ return nullptr;
}
if (networking_at_startup() != 0) {
- return NULL;
+ return nullptr;
}
TCP_Server *temp = (TCP_Server *)calloc(1, sizeof(TCP_Server));
- if (temp == NULL) {
- return NULL;
+ if (temp == nullptr) {
+ return nullptr;
}
temp->socks_listening = (Socket *)calloc(num_sockets, sizeof(Socket));
- if (temp->socks_listening == NULL) {
+ if (temp->socks_listening == nullptr) {
free(temp);
- return NULL;
+ return nullptr;
}
#ifdef TCP_SERVER_USE_EPOLL
@@ -1061,7 +1063,7 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin
if (temp->efd == -1) {
free(temp->socks_listening);
free(temp);
- return NULL;
+ return nullptr;
}
#endif
@@ -1101,7 +1103,7 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin
if (temp->num_listening_socks == 0) {
free(temp->socks_listening);
free(temp);
- return NULL;
+ return nullptr;
}
if (onion) {
@@ -1429,7 +1431,7 @@ void kill_TCP_server(TCP_Server *TCP_server)
}
if (TCP_server->onion) {
- set_callback_handle_recv_1(TCP_server->onion, NULL, NULL);
+ set_callback_handle_recv_1(TCP_server->onion, nullptr, nullptr);
}
bs_list_free(&TCP_server->accepted_key_list);
diff --git a/protocols/Tox/libtox/src/toxcore/ccompat.h b/protocols/Tox/libtox/src/toxcore/ccompat.h
index e72e66ae58..1ceb5a5a87 100644
--- a/protocols/Tox/libtox/src/toxcore/ccompat.h
+++ b/protocols/Tox/libtox/src/toxcore/ccompat.h
@@ -4,13 +4,6 @@
#ifndef CCOMPAT_H
#define CCOMPAT_H
-// Marking GNU extensions to avoid warnings.
-#if defined(__GNUC__)
-#define GNU_EXTENSION __extension__
-#else
-#define GNU_EXTENSION
-#endif
-
// Variable length arrays.
// VLA(type, name, size) allocates a variable length array with automatic
// storage duration. VLA_SIZE(name) evaluates to the runtime size of that array
@@ -20,7 +13,7 @@
// "function") is used. Note the semantic difference: alloca'd memory does not
// get freed at the end of the declaration's scope. Do not use VLA() in loops or
// you may run out of stack space.
-#if !defined(_MSC_VER) && __STDC_VERSION__ >= 199901L
+#if !defined(_MSC_VER) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
// C99 VLAs.
#define VLA(type, name, size) type name[size]
#define SIZEOF_VLA sizeof
@@ -29,6 +22,11 @@
// Emulation using alloca.
#ifdef _WIN32
#include <malloc.h>
+#elif defined(__FreeBSD__)
+#include <stdlib.h>
+#if !defined(alloca) && defined(__GNUC__)
+#define alloca __builtin_alloca
+#endif
#else
#include <alloca.h>
#endif
@@ -40,4 +38,14 @@
#endif
+#ifndef __cplusplus
+#define nullptr NULL
+#endif
+
+#ifdef __GNUC__
+#define GNU_PRINTF __attribute__((__format__(__printf__, 6, 7)))
+#else
+#define GNU_PRINTF
+#endif
+
#endif /* CCOMPAT_H */
diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core.api.h b/protocols/Tox/libtox/src/toxcore/crypto_core.api.h
index 0ba28c0c1b..bb2c0a13b8 100644
--- a/protocols/Tox/libtox/src/toxcore/crypto_core.api.h
+++ b/protocols/Tox/libtox/src/toxcore/crypto_core.api.h
@@ -28,6 +28,10 @@
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
%}
/**
@@ -251,5 +255,9 @@ static void increment_nonce_number(uint8_t[CRYPTO_NONCE_SIZE] nonce, uint32_t ho
static void new_symmetric_key(uint8_t[CRYPTO_SYMMETRIC_KEY_SIZE] key);
%{
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
#endif /* CRYPTO_CORE_H */
%}
diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core.c b/protocols/Tox/libtox/src/toxcore/crypto_core.c
index d5333e6760..26589219ed 100644
--- a/protocols/Tox/libtox/src/toxcore/crypto_core.c
+++ b/protocols/Tox/libtox/src/toxcore/crypto_core.c
@@ -219,7 +219,7 @@ void increment_nonce(uint8_t *nonce)
static uint32_t host_to_network(uint32_t x)
{
-#if BYTE_ORDER == LITTLE_ENDIAN
+#if !defined(BYTE_ORDER) || BYTE_ORDER == LITTLE_ENDIAN
return
((x >> 24) & 0x000000FF) | // move byte 3 to byte 0
((x >> 8) & 0x0000FF00) | // move byte 2 to byte 1
diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core.h b/protocols/Tox/libtox/src/toxcore/crypto_core.h
index d2742a8b72..2c83fd255a 100644
--- a/protocols/Tox/libtox/src/toxcore/crypto_core.h
+++ b/protocols/Tox/libtox/src/toxcore/crypto_core.h
@@ -28,6 +28,10 @@
#include <stdint.h>
#include <stdlib.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/**
* The number of bytes in a Tox public key.
*/
@@ -236,4 +240,8 @@ void increment_nonce_number(uint8_t *nonce, uint32_t host_order_num);
*/
void new_symmetric_key(uint8_t *key);
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
#endif /* CRYPTO_CORE_H */
diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core_test.cpp b/protocols/Tox/libtox/src/toxcore/crypto_core_test.cpp
new file mode 100644
index 0000000000..8f91dce842
--- /dev/null
+++ b/protocols/Tox/libtox/src/toxcore/crypto_core_test.cpp
@@ -0,0 +1,96 @@
+#include "crypto_core.h"
+
+#include <algorithm>
+
+#include <gtest/gtest.h>
+
+namespace
+{
+
+enum {
+ /**
+ * The size of the arrays to compare. This was chosen to take around 2000
+ * CPU clocks on x86_64.
+ */
+ CRYPTO_TEST_MEMCMP_SIZE = 1024 * 1024, // 1 MiB
+ /**
+ * The number of times we run memcmp in the test.
+ *
+ * We compute the median time taken to reduce error margins.
+ */
+ CRYPTO_TEST_MEMCMP_ITERATIONS = 500,
+ /**
+ * The margin of error (in clocks) we allow for this test.
+ *
+ * Should be within 0.5% of ~2000 CPU clocks. In reality, the code is much
+ * more precise and is usually within 1 CPU clock.
+ */
+ CRYPTO_TEST_MEMCMP_EPS = 10,
+};
+
+clock_t memcmp_time(void *a, void *b, size_t len)
+{
+ clock_t start = clock();
+ crypto_memcmp(a, b, len);
+ return clock() - start;
+}
+
+/**
+ * This function performs the actual timing. It interleaves comparison of
+ * equal and non-equal arrays to reduce the influence of external effects
+ * such as the machine being a little more busy 1 second later.
+ */
+void memcmp_median(void *src, void *same, void *not_same, size_t len,
+ clock_t *same_median, clock_t *not_same_median)
+{
+ clock_t same_results[CRYPTO_TEST_MEMCMP_ITERATIONS];
+ clock_t not_same_results[CRYPTO_TEST_MEMCMP_ITERATIONS];
+
+ for (size_t i = 0; i < CRYPTO_TEST_MEMCMP_ITERATIONS; i++) {
+ same_results[i] = memcmp_time(src, same, len);
+ not_same_results[i] = memcmp_time(src, not_same, len);
+ }
+
+ std::sort(same_results, same_results + CRYPTO_TEST_MEMCMP_ITERATIONS);
+ *same_median = same_results[CRYPTO_TEST_MEMCMP_ITERATIONS / 2];
+ std::sort(not_same_results, not_same_results + CRYPTO_TEST_MEMCMP_ITERATIONS);
+ *not_same_median = not_same_results[CRYPTO_TEST_MEMCMP_ITERATIONS / 2];
+}
+
+/**
+ * This test checks whether crypto_memcmp takes the same time for equal and
+ * non-equal chunks of memory.
+ */
+TEST(CryptoCore, MemcmpTimingIsDataIndependent)
+{
+ // A random piece of memory.
+ uint8_t *src = new uint8_t[CRYPTO_TEST_MEMCMP_SIZE];
+ random_bytes(src, CRYPTO_TEST_MEMCMP_SIZE);
+
+ // A separate piece of memory containing the same data.
+ uint8_t *same = new uint8_t[CRYPTO_TEST_MEMCMP_SIZE];
+ memcpy(same, src, CRYPTO_TEST_MEMCMP_SIZE);
+
+ // Another piece of memory containing different data.
+ uint8_t *not_same = new uint8_t[CRYPTO_TEST_MEMCMP_SIZE];
+ random_bytes(not_same, CRYPTO_TEST_MEMCMP_SIZE);
+
+ clock_t same_median;
+ clock_t not_same_median;
+ memcmp_median(src, same, not_same, CRYPTO_TEST_MEMCMP_SIZE, &same_median, &not_same_median);
+
+ delete[] not_same;
+ delete[] same;
+ delete[] src;
+
+ clock_t const delta = same_median > not_same_median
+ ? same_median - not_same_median
+ : not_same_median - same_median;
+
+ EXPECT_LT(delta, CRYPTO_TEST_MEMCMP_EPS)
+ << "Delta time is too long (" << delta << " >= " << CRYPTO_TEST_MEMCMP_EPS << ")\n"
+ << "Time of the same data comparation: " << same_median << " clocks\n"
+ << "Time of the different data comparation: " << not_same_median << " clocks";
+}
+
+} // namespace
diff --git a/protocols/Tox/libtox/src/toxcore/friend_connection.c b/protocols/Tox/libtox/src/toxcore/friend_connection.c
index 2ebc0d9bc0..6f5685fb5d 100644
--- a/protocols/Tox/libtox/src/toxcore/friend_connection.c
+++ b/protocols/Tox/libtox/src/toxcore/friend_connection.c
@@ -88,48 +88,38 @@ Net_Crypto *friendconn_net_crypto(const Friend_Connections *fr_c)
}
-/* return 1 if the friendcon_id is not valid.
- * return 0 if the friendcon_id is valid.
+/* return true if the friendcon_id is valid.
+ * return false if the friendcon_id is not valid.
*/
-static uint8_t friendconn_id_not_valid(const Friend_Connections *fr_c, int friendcon_id)
+static bool friendconn_id_valid(const Friend_Connections *fr_c, int friendcon_id)
{
- if ((unsigned int)friendcon_id >= fr_c->num_cons) {
- return 1;
- }
-
- if (fr_c->conns == NULL) {
- return 1;
- }
-
- if (fr_c->conns[friendcon_id].status == FRIENDCONN_STATUS_NONE) {
- return 1;
- }
-
- return 0;
+ return (unsigned int)friendcon_id < fr_c->num_cons &&
+ fr_c->conns != nullptr &&
+ fr_c->conns[friendcon_id].status != FRIENDCONN_STATUS_NONE;
}
/* Set the size of the friend connections list to num.
*
- * return -1 if realloc fails.
- * return 0 if it succeeds.
+ * return false if realloc fails.
+ * return true if it succeeds.
*/
-static int realloc_friendconns(Friend_Connections *fr_c, uint32_t num)
+static bool realloc_friendconns(Friend_Connections *fr_c, uint32_t num)
{
if (num == 0) {
free(fr_c->conns);
- fr_c->conns = NULL;
- return 0;
+ fr_c->conns = nullptr;
+ return true;
}
Friend_Conn *newgroup_cons = (Friend_Conn *)realloc(fr_c->conns, num * sizeof(Friend_Conn));
- if (newgroup_cons == NULL) {
- return -1;
+ if (newgroup_cons == nullptr) {
+ return false;
}
fr_c->conns = newgroup_cons;
- return 0;
+ return true;
}
/* Create a new empty friend connection.
@@ -139,22 +129,20 @@ static int realloc_friendconns(Friend_Connections *fr_c, uint32_t num)
*/
static int create_friend_conn(Friend_Connections *fr_c)
{
- uint32_t i;
-
- for (i = 0; i < fr_c->num_cons; ++i) {
+ for (uint32_t i = 0; i < fr_c->num_cons; ++i) {
if (fr_c->conns[i].status == FRIENDCONN_STATUS_NONE) {
return i;
}
}
- int id = -1;
-
- if (realloc_friendconns(fr_c, fr_c->num_cons + 1) == 0) {
- id = fr_c->num_cons;
- ++fr_c->num_cons;
- memset(&fr_c->conns[id], 0, sizeof(Friend_Conn));
+ if (!realloc_friendconns(fr_c, fr_c->num_cons + 1)) {
+ return -1;
}
+ const int id = fr_c->num_cons;
+ ++fr_c->num_cons;
+ memset(&fr_c->conns[id], 0, sizeof(Friend_Conn));
+
return id;
}
@@ -165,13 +153,14 @@ static int create_friend_conn(Friend_Connections *fr_c)
*/
static int wipe_friend_conn(Friend_Connections *fr_c, int friendcon_id)
{
- if (friendconn_id_not_valid(fr_c, friendcon_id)) {
+ if (!friendconn_id_valid(fr_c, friendcon_id)) {
return -1;
}
- uint32_t i;
memset(&fr_c->conns[friendcon_id], 0, sizeof(Friend_Conn));
+ uint32_t i;
+
for (i = fr_c->num_cons; i != 0; --i) {
if (fr_c->conns[i - 1].status != FRIENDCONN_STATUS_NONE) {
break;
@@ -188,8 +177,8 @@ static int wipe_friend_conn(Friend_Connections *fr_c, int friendcon_id)
static Friend_Conn *get_conn(const Friend_Connections *fr_c, int friendcon_id)
{
- if (friendconn_id_not_valid(fr_c, friendcon_id)) {
- return 0;
+ if (!friendconn_id_valid(fr_c, friendcon_id)) {
+ return nullptr;
}
return &fr_c->conns[friendcon_id];
@@ -200,9 +189,7 @@ static Friend_Conn *get_conn(const Friend_Connections *fr_c, int friendcon_id)
*/
int getfriend_conn_id_pk(Friend_Connections *fr_c, const uint8_t *real_pk)
{
- uint32_t i;
-
- for (i = 0; i < fr_c->num_cons; ++i) {
+ for (uint32_t i = 0; i < fr_c->num_cons; ++i) {
Friend_Conn *friend_con = get_conn(fr_c, i);
if (friend_con) {
@@ -222,7 +209,7 @@ int getfriend_conn_id_pk(Friend_Connections *fr_c, const uint8_t *real_pk)
*/
int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_port, const uint8_t *public_key)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -237,11 +224,9 @@ int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_
}
}
- unsigned int i;
-
- uint16_t index = friend_con->tcp_relay_counter % FRIEND_MAX_STORED_TCP_RELAYS;
+ const uint16_t index = friend_con->tcp_relay_counter % FRIEND_MAX_STORED_TCP_RELAYS;
- for (i = 0; i < FRIEND_MAX_STORED_TCP_RELAYS; ++i) {
+ for (unsigned i = 0; i < FRIEND_MAX_STORED_TCP_RELAYS; ++i) {
if (friend_con->tcp_relays[i].ip_port.ip.family != 0
&& public_key_cmp(friend_con->tcp_relays[i].public_key, public_key) == 0) {
memset(&friend_con->tcp_relays[i], 0, sizeof(Node_format));
@@ -258,16 +243,14 @@ int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_
/* Connect to number saved relays for friend. */
static void connect_to_saved_tcp_relays(Friend_Connections *fr_c, int friendcon_id, unsigned int number)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return;
}
- unsigned int i;
-
- for (i = 0; (i < FRIEND_MAX_STORED_TCP_RELAYS) && (number != 0); ++i) {
- uint16_t index = (friend_con->tcp_relay_counter - (i + 1)) % FRIEND_MAX_STORED_TCP_RELAYS;
+ for (unsigned i = 0; (i < FRIEND_MAX_STORED_TCP_RELAYS) && (number != 0); ++i) {
+ const uint16_t index = (friend_con->tcp_relay_counter - (i + 1)) % FRIEND_MAX_STORED_TCP_RELAYS;
if (friend_con->tcp_relays[index].ip_port.ip.family) {
if (add_tcp_relay_peer(fr_c->net_crypto, friend_con->crypt_connection_id, friend_con->tcp_relays[index].ip_port,
@@ -280,7 +263,7 @@ static void connect_to_saved_tcp_relays(Friend_Connections *fr_c, int friendcon_
static unsigned int send_relays(Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return 0;
@@ -288,19 +271,16 @@ static unsigned int send_relays(Friend_Connections *fr_c, int friendcon_id)
Node_format nodes[MAX_SHARED_RELAYS];
uint8_t data[1024];
- int n, length;
-
- n = copy_connected_tcp_relays(fr_c->net_crypto, nodes, MAX_SHARED_RELAYS);
- int i;
+ const int n = copy_connected_tcp_relays(fr_c->net_crypto, nodes, MAX_SHARED_RELAYS);
- for (i = 0; i < n; ++i) {
+ for (int i = 0; i < n; ++i) {
/* Associated the relays being sent with this connection.
On receiving the peer will do the same which will establish the connection. */
friend_add_tcp_relay(fr_c, friendcon_id, nodes[i].ip_port, nodes[i].public_key);
}
- length = pack_nodes(data + 1, sizeof(data) - 1, nodes, n);
+ int length = pack_nodes(data + 1, sizeof(data) - 1, nodes, n);
if (length <= 0) {
return 0;
@@ -321,7 +301,7 @@ static unsigned int send_relays(Friend_Connections *fr_c, int friendcon_id)
static int tcp_relay_node_callback(void *object, uint32_t number, IP_Port ip_port, const uint8_t *public_key)
{
Friend_Connections *fr_c = (Friend_Connections *)object;
- Friend_Conn *friend_con = get_conn(fr_c, number);
+ const Friend_Conn *friend_con = get_conn(fr_c, number);
if (!friend_con) {
return -1;
@@ -338,8 +318,8 @@ static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id);
/* Callback for DHT ip_port changes. */
static void dht_ip_callback(void *object, int32_t number, IP_Port ip_port)
{
- Friend_Connections *fr_c = (Friend_Connections *)object;
- Friend_Conn *friend_con = get_conn(fr_c, number);
+ Friend_Connections *const fr_c = (Friend_Connections *)object;
+ Friend_Conn *const friend_con = get_conn(fr_c, number);
if (!friend_con) {
return;
@@ -361,7 +341,7 @@ static void dht_ip_callback(void *object, int32_t number, IP_Port ip_port)
static void change_dht_pk(Friend_Connections *fr_c, int friendcon_id, const uint8_t *dht_public_key)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return;
@@ -384,8 +364,8 @@ static void change_dht_pk(Friend_Connections *fr_c, int friendcon_id, const uint
static int handle_status(void *object, int number, uint8_t status, void *userdata)
{
- Friend_Connections *fr_c = (Friend_Connections *)object;
- Friend_Conn *friend_con = get_conn(fr_c, number);
+ Friend_Connections *const fr_c = (Friend_Connections *)object;
+ Friend_Conn *const friend_con = get_conn(fr_c, number);
if (!friend_con) {
return -1;
@@ -429,8 +409,8 @@ static int handle_status(void *object, int number, uint8_t status, void *userdat
/* Callback for dht public key changes. */
static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_public_key, void *userdata)
{
- Friend_Connections *fr_c = (Friend_Connections *)object;
- Friend_Conn *friend_con = get_conn(fr_c, number);
+ Friend_Connections *const fr_c = (Friend_Connections *)object;
+ Friend_Conn *const friend_con = get_conn(fr_c, number);
if (!friend_con) {
return;
@@ -459,7 +439,7 @@ static int handle_packet(void *object, int number, const uint8_t *data, uint16_t
return -1;
}
- Friend_Connections *fr_c = (Friend_Connections *)object;
+ Friend_Connections *const fr_c = (Friend_Connections *)object;
Friend_Conn *friend_con = get_conn(fr_c, number);
if (!friend_con) {
@@ -481,24 +461,20 @@ static int handle_packet(void *object, int number, const uint8_t *data, uint16_t
if (data[0] == PACKET_ID_SHARE_RELAYS) {
Node_format nodes[MAX_SHARED_RELAYS];
- int n;
+ const int n = unpack_nodes(nodes, MAX_SHARED_RELAYS, nullptr, data + 1, length - 1, 1);
- if ((n = unpack_nodes(nodes, MAX_SHARED_RELAYS, NULL, data + 1, length - 1, 1)) == -1) {
+ if (n == -1) {
return -1;
}
- int j;
-
- for (j = 0; j < n; j++) {
+ for (int j = 0; j < n; j++) {
friend_add_tcp_relay(fr_c, number, nodes[j].ip_port, nodes[j].public_key);
}
return 0;
}
- unsigned int i;
-
- for (i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) {
+ for (unsigned i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) {
if (friend_con->callbacks[i].data_callback) {
friend_con->callbacks[i].data_callback(
friend_con->callbacks[i].callback_object,
@@ -521,16 +497,14 @@ static int handle_lossy_packet(void *object, int number, const uint8_t *data, ui
return -1;
}
- Friend_Connections *fr_c = (Friend_Connections *)object;
- Friend_Conn *friend_con = get_conn(fr_c, number);
+ Friend_Connections *const fr_c = (Friend_Connections *)object;
+ const Friend_Conn *friend_con = get_conn(fr_c, number);
if (!friend_con) {
return -1;
}
- unsigned int i;
-
- for (i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) {
+ for (unsigned i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) {
if (friend_con->callbacks[i].lossy_data_callback) {
friend_con->callbacks[i].lossy_data_callback(
friend_con->callbacks[i].callback_object,
@@ -549,48 +523,47 @@ static int handle_lossy_packet(void *object, int number, const uint8_t *data, ui
static int handle_new_connections(void *object, New_Connection *n_c)
{
- Friend_Connections *fr_c = (Friend_Connections *)object;
- int friendcon_id = getfriend_conn_id_pk(fr_c, n_c->public_key);
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Connections *const fr_c = (Friend_Connections *)object;
+ const int friendcon_id = getfriend_conn_id_pk(fr_c, n_c->public_key);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
- if (friend_con) {
-
- if (friend_con->crypt_connection_id != -1) {
- return -1;
- }
+ if (!friend_con) {
+ return -1;
+ }
- int id = accept_crypto_connection(fr_c->net_crypto, n_c);
+ if (friend_con->crypt_connection_id != -1) {
+ return -1;
+ }
- if (id == -1) {
- return -1;
- }
+ const int id = accept_crypto_connection(fr_c->net_crypto, n_c);
- connection_status_handler(fr_c->net_crypto, id, &handle_status, fr_c, friendcon_id);
- connection_data_handler(fr_c->net_crypto, id, &handle_packet, fr_c, friendcon_id);
- connection_lossy_data_handler(fr_c->net_crypto, id, &handle_lossy_packet, fr_c, friendcon_id);
- friend_con->crypt_connection_id = id;
+ if (id == -1) {
+ return -1;
+ }
- if (n_c->source.ip.family != TOX_AF_INET && n_c->source.ip.family != TOX_AF_INET6) {
- set_direct_ip_port(fr_c->net_crypto, friend_con->crypt_connection_id, friend_con->dht_ip_port, 0);
- } else {
- friend_con->dht_ip_port = n_c->source;
- friend_con->dht_ip_port_lastrecv = unix_time();
- }
+ connection_status_handler(fr_c->net_crypto, id, &handle_status, fr_c, friendcon_id);
+ connection_data_handler(fr_c->net_crypto, id, &handle_packet, fr_c, friendcon_id);
+ connection_lossy_data_handler(fr_c->net_crypto, id, &handle_lossy_packet, fr_c, friendcon_id);
+ friend_con->crypt_connection_id = id;
- if (public_key_cmp(friend_con->dht_temp_pk, n_c->dht_public_key) != 0) {
- change_dht_pk(fr_c, friendcon_id, n_c->dht_public_key);
- }
+ if (n_c->source.ip.family != TOX_AF_INET && n_c->source.ip.family != TOX_AF_INET6) {
+ set_direct_ip_port(fr_c->net_crypto, friend_con->crypt_connection_id, friend_con->dht_ip_port, 0);
+ } else {
+ friend_con->dht_ip_port = n_c->source;
+ friend_con->dht_ip_port_lastrecv = unix_time();
+ }
- nc_dht_pk_callback(fr_c->net_crypto, id, &dht_pk_callback, fr_c, friendcon_id);
- return 0;
+ if (public_key_cmp(friend_con->dht_temp_pk, n_c->dht_public_key) != 0) {
+ change_dht_pk(fr_c, friendcon_id, n_c->dht_public_key);
}
- return -1;
+ nc_dht_pk_callback(fr_c->net_crypto, id, &dht_pk_callback, fr_c, friendcon_id);
+ return 0;
}
static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -605,7 +578,7 @@ static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id)
return -1;
}
- int id = new_crypto_connection(fr_c->net_crypto, friend_con->real_public_key, friend_con->dht_temp_pk);
+ const int id = new_crypto_connection(fr_c->net_crypto, friend_con->real_public_key, friend_con->dht_temp_pk);
if (id == -1) {
return -1;
@@ -622,14 +595,14 @@ static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id)
static int send_ping(const Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
}
- uint8_t ping = PACKET_ID_ALIVE;
- int64_t ret = write_cryptpacket(fr_c->net_crypto, friend_con->crypt_connection_id, &ping, sizeof(ping), 0);
+ const uint8_t ping = PACKET_ID_ALIVE;
+ const int64_t ret = write_cryptpacket(fr_c->net_crypto, friend_con->crypt_connection_id, &ping, sizeof(ping), 0);
if (ret != -1) {
friend_con->ping_lastsent = unix_time();
@@ -646,7 +619,7 @@ static int send_ping(const Friend_Connections *fr_c, int friendcon_id)
*/
int friend_connection_lock(Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -662,7 +635,7 @@ int friend_connection_lock(Friend_Connections *fr_c, int friendcon_id)
*/
unsigned int friend_con_connected(Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return 0;
@@ -678,7 +651,7 @@ unsigned int friend_con_connected(Friend_Connections *fr_c, int friendcon_id)
*/
int get_friendcon_public_keys(uint8_t *real_pk, uint8_t *dht_temp_pk, Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -714,7 +687,7 @@ int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsi
int (*lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length, void *userdata),
void *object, int number)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -741,7 +714,7 @@ int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsi
*/
int friend_connection_crypt_connection_id(Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -771,13 +744,13 @@ int new_friend_connection(Friend_Connections *fr_c, const uint8_t *real_public_k
return -1;
}
- int32_t onion_friendnum = onion_addfriend(fr_c->onion_c, real_public_key);
+ const int32_t onion_friendnum = onion_addfriend(fr_c->onion_c, real_public_key);
if (onion_friendnum == -1) {
return -1;
}
- Friend_Conn *friend_con = &fr_c->conns[friendcon_id];
+ Friend_Conn *const friend_con = &fr_c->conns[friendcon_id];
friend_con->crypt_connection_id = -1;
friend_con->status = FRIENDCONN_STATUS_CONNECTING;
@@ -797,7 +770,7 @@ int new_friend_connection(Friend_Connections *fr_c, const uint8_t *real_public_k
*/
int kill_friend_connection(Friend_Connections *fr_c, int friendcon_id)
{
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -844,7 +817,7 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3
return -1;
}
- Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);
+ const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id);
if (!friend_con) {
return -1;
@@ -860,7 +833,7 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3
}
packet[0] = CRYPTO_PACKET_FRIEND_REQ;
- int num = send_onion_data(fr_c->onion_c, friend_con->onion_friendnum, packet, SIZEOF_VLA(packet));
+ const int num = send_onion_data(fr_c->onion_c, friend_con->onion_friendnum, packet, SIZEOF_VLA(packet));
if (num <= 0) {
return -1;
@@ -872,14 +845,14 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3
/* Create new friend_connections instance. */
Friend_Connections *new_friend_connections(Onion_Client *onion_c, bool local_discovery_enabled)
{
- if (!onion_c) {
- return NULL;
+ if (onion_c == nullptr) {
+ return nullptr;
}
- Friend_Connections *temp = (Friend_Connections *)calloc(1, sizeof(Friend_Connections));
+ Friend_Connections *const temp = (Friend_Connections *)calloc(1, sizeof(Friend_Connections));
- if (temp == NULL) {
- return NULL;
+ if (temp == nullptr) {
+ return nullptr;
}
temp->dht = onion_get_dht(onion_c);
@@ -923,11 +896,10 @@ static void LANdiscovery(Friend_Connections *fr_c)
/* main friend_connections loop. */
void do_friend_connections(Friend_Connections *fr_c, void *userdata)
{
- uint32_t i;
- uint64_t temp_time = unix_time();
+ const uint64_t temp_time = unix_time();
- for (i = 0; i < fr_c->num_cons; ++i) {
- Friend_Conn *friend_con = get_conn(fr_c, i);
+ for (uint32_t i = 0; i < fr_c->num_cons; ++i) {
+ Friend_Conn *const friend_con = get_conn(fr_c, i);
if (friend_con) {
if (friend_con->status == FRIENDCONN_STATUS_CONNECTING) {
@@ -980,9 +952,7 @@ void kill_friend_connections(Friend_Connections *fr_c)
return;
}
- uint32_t i;
-
- for (i = 0; i < fr_c->num_cons; ++i) {
+ for (uint32_t i = 0; i < fr_c->num_cons; ++i) {
kill_friend_connection(fr_c, i);
}
diff --git a/protocols/Tox/libtox/src/toxcore/friend_requests.c b/protocols/Tox/libtox/src/toxcore/friend_requests.c
index 4a06654deb..13c89eae13 100644
--- a/protocols/Tox/libtox/src/toxcore/friend_requests.c
+++ b/protocols/Tox/libtox/src/toxcore/friend_requests.c
@@ -67,6 +67,7 @@ void callback_friendrequest(Friend_Requests *fr, void (*function)(void *, const
fr->handle_friendrequest_isset = 1;
fr->handle_friendrequest_object = object;
}
+
/* Set the function used to check if a friend request should be displayed to the user or not. */
void set_filter_function(Friend_Requests *fr, int (*function)(const uint8_t *, void *), void *userdata)
{
@@ -87,20 +88,18 @@ static void addto_receivedlist(Friend_Requests *fr, const uint8_t *real_pk)
/* Check if a friend request was already received.
*
- * return 0 if it did not.
- * return 1 if it did.
+ * return false if it did not.
+ * return true if it did.
*/
-static int request_received(Friend_Requests *fr, const uint8_t *real_pk)
+static bool request_received(const Friend_Requests *fr, const uint8_t *real_pk)
{
- uint32_t i;
-
- for (i = 0; i < MAX_RECEIVED_STORED; ++i) {
+ for (uint32_t i = 0; i < MAX_RECEIVED_STORED; ++i) {
if (id_equal(fr->received_requests[i], real_pk)) {
- return 1;
+ return true;
}
}
- return 0;
+ return false;
}
/* Remove real pk from received_requests list.
@@ -110,9 +109,7 @@ static int request_received(Friend_Requests *fr, const uint8_t *real_pk)
*/
int remove_request_received(Friend_Requests *fr, const uint8_t *real_pk)
{
- uint32_t i;
-
- for (i = 0; i < MAX_RECEIVED_STORED; ++i) {
+ for (uint32_t i = 0; i < MAX_RECEIVED_STORED; ++i) {
if (id_equal(fr->received_requests[i], real_pk)) {
crypto_memzero(fr->received_requests[i], CRYPTO_PUBLIC_KEY_SIZE);
return 0;
@@ -126,7 +123,7 @@ int remove_request_received(Friend_Requests *fr, const uint8_t *real_pk)
static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length,
void *userdata)
{
- Friend_Requests *fr = (Friend_Requests *)object;
+ Friend_Requests *const fr = (Friend_Requests *)object;
if (length <= 1 + sizeof(fr->nospam) || length > ONION_CLIENT_MAX_DATA_SIZE) {
return 1;
@@ -148,19 +145,19 @@ static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, co
}
if (fr->filter_function) {
- if ((*fr->filter_function)(source_pubkey, fr->filter_function_userdata) != 0) {
+ if (fr->filter_function(source_pubkey, fr->filter_function_userdata) != 0) {
return 1;
}
}
addto_receivedlist(fr, source_pubkey);
- uint32_t message_len = length - sizeof(fr->nospam);
+ const uint32_t message_len = length - sizeof(fr->nospam);
VLA(uint8_t, message, message_len + 1);
memcpy(message, packet + sizeof(fr->nospam), message_len);
message[SIZEOF_VLA(message) - 1] = 0; /* Be sure the message is null terminated. */
- (*fr->handle_friendrequest)(fr->handle_friendrequest_object, source_pubkey, message, message_len, userdata);
+ fr->handle_friendrequest(fr->handle_friendrequest_object, source_pubkey, message, message_len, userdata);
return 0;
}
diff --git a/protocols/Tox/libtox/src/toxcore/group.c b/protocols/Tox/libtox/src/toxcore/group.c
index 30f241ade5..37b4437d79 100644
--- a/protocols/Tox/libtox/src/toxcore/group.c
+++ b/protocols/Tox/libtox/src/toxcore/group.c
@@ -32,13 +32,13 @@
/* return 1 if the groupnumber is not valid.
* return 0 if the groupnumber is valid.
*/
-static uint8_t groupnumber_not_valid(const Group_Chats *g_c, int groupnumber)
+static uint8_t groupnumber_not_valid(const Group_Chats *g_c, uint32_t groupnumber)
{
- if ((unsigned int)groupnumber >= g_c->num_chats) {
+ if (groupnumber >= g_c->num_chats) {
return 1;
}
- if (g_c->chats == NULL) {
+ if (g_c->chats == nullptr) {
return 1;
}
@@ -59,13 +59,13 @@ static int realloc_groupchats(Group_Chats *g_c, uint32_t num)
{
if (num == 0) {
free(g_c->chats);
- g_c->chats = NULL;
+ g_c->chats = nullptr;
return 0;
}
Group_c *newgroup_chats = (Group_c *)realloc(g_c->chats, num * sizeof(Group_c));
- if (newgroup_chats == NULL) {
+ if (newgroup_chats == nullptr) {
return -1;
}
@@ -106,7 +106,7 @@ static int create_group_chat(Group_Chats *g_c)
* return -1 on failure.
* return 0 on success.
*/
-static int wipe_group_chat(Group_Chats *g_c, int groupnumber)
+static int wipe_group_chat(Group_Chats *g_c, uint32_t groupnumber)
{
if (groupnumber_not_valid(g_c, groupnumber)) {
return -1;
@@ -129,10 +129,10 @@ static int wipe_group_chat(Group_Chats *g_c, int groupnumber)
return 0;
}
-static Group_c *get_group_c(const Group_Chats *g_c, int groupnumber)
+static Group_c *get_group_c(const Group_Chats *g_c, uint32_t groupnumber)
{
if (groupnumber_not_valid(g_c, groupnumber)) {
- return 0;
+ return nullptr;
}
return &g_c->chats[groupnumber];
@@ -224,9 +224,10 @@ enum {
};
static int friend_in_close(Group_c *g, int friendcon_id);
-static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, int groupnumber, uint8_t closest, uint8_t lock);
+static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, uint32_t groupnumber, uint8_t closest,
+ uint8_t lock);
-static int add_to_closest(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk)
+static int add_to_closest(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -328,7 +329,7 @@ static unsigned int pk_in_closest_peers(Group_c *g, uint8_t *real_pk)
static int send_packet_online(Friend_Connections *fr_c, int friendcon_id, uint16_t group_num, uint8_t *identifier);
-static int connect_to_closest(Group_Chats *g_c, int groupnumber, void *userdata)
+static int connect_to_closest(Group_Chats *g_c, uint32_t groupnumber, void *userdata)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -408,7 +409,7 @@ static int connect_to_closest(Group_Chats *g_c, int groupnumber, void *userdata)
* return peer_index if success or peer already in chat.
* return -1 if error.
*/
-static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk,
+static int addpeer(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk,
uint16_t peer_number, void *userdata, bool do_gc_callback)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -438,7 +439,7 @@ static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, co
Group_Peer *temp = (Group_Peer *)realloc(g->group, sizeof(Group_Peer) * (g->numpeers + 1));
- if (temp == NULL) {
+ if (temp == nullptr) {
return -1;
}
@@ -454,8 +455,8 @@ static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, co
add_to_closest(g_c, groupnumber, real_pk, temp_pk);
- if (do_gc_callback && g_c->group_namelistchange) {
- g_c->group_namelistchange(g_c->m, groupnumber, g->numpeers - 1, CHAT_CHANGE_PEER_ADD, userdata);
+ if (do_gc_callback && g_c->peer_list_changed_callback) {
+ g_c->peer_list_changed_callback(g_c->m, groupnumber, userdata);
}
if (g->peer_on_join) {
@@ -465,7 +466,7 @@ static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, co
return (g->numpeers - 1);
}
-static int remove_close_conn(Group_Chats *g_c, int groupnumber, int friendcon_id)
+static int remove_close_conn(Group_Chats *g_c, uint32_t groupnumber, int friendcon_id)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -497,7 +498,7 @@ static int remove_close_conn(Group_Chats *g_c, int groupnumber, int friendcon_id
* return 0 if success
* return -1 if error.
*/
-static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *userdata)
+static int delpeer(Group_Chats *g_c, uint32_t groupnumber, int peer_index, void *userdata)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -527,7 +528,7 @@ static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *user
if (g->numpeers == 0) {
free(g->group);
- g->group = NULL;
+ g->group = nullptr;
} else {
if (g->numpeers != (uint32_t)peer_index) {
memcpy(&g->group[peer_index], &g->group[g->numpeers], sizeof(Group_Peer));
@@ -535,15 +536,15 @@ static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *user
Group_Peer *temp = (Group_Peer *)realloc(g->group, sizeof(Group_Peer) * (g->numpeers));
- if (temp == NULL) {
+ if (temp == nullptr) {
return -1;
}
g->group = temp;
}
- if (g_c->group_namelistchange) {
- g_c->group_namelistchange(g_c->m, groupnumber, peer_index, CHAT_CHANGE_PEER_DEL, userdata);
+ if (g_c->peer_list_changed_callback) {
+ g_c->peer_list_changed_callback(g_c->m, groupnumber, userdata);
}
if (g->peer_on_leave) {
@@ -562,7 +563,7 @@ static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *user
* return 0 on success.
* return -1 if error.
*/
-static int setnick(Group_Chats *g_c, int groupnumber, int peer_index, const uint8_t *nick, uint16_t nick_len,
+static int setnick(Group_Chats *g_c, uint32_t groupnumber, int peer_index, const uint8_t *nick, uint16_t nick_len,
void *userdata, bool do_gc_callback)
{
if (nick_len > MAX_NAME_LENGTH) {
@@ -588,14 +589,14 @@ static int setnick(Group_Chats *g_c, int groupnumber, int peer_index, const uint
g->group[peer_index].nick_len = nick_len;
- if (do_gc_callback && g_c->group_namelistchange) {
- g_c->group_namelistchange(g_c->m, groupnumber, peer_index, CHAT_CHANGE_PEER_NAME, userdata);
+ if (do_gc_callback && g_c->peer_name_callback) {
+ g_c->peer_name_callback(g_c->m, groupnumber, peer_index, nick, nick_len, userdata);
}
return 0;
}
-static int settitle(Group_Chats *g_c, int groupnumber, int peer_index, const uint8_t *title, uint8_t title_len,
+static int settitle(Group_Chats *g_c, uint32_t groupnumber, int peer_index, const uint8_t *title, uint8_t title_len,
void *userdata)
{
if (title_len > MAX_NAME_LENGTH || title_len == 0) {
@@ -623,7 +624,7 @@ static int settitle(Group_Chats *g_c, int groupnumber, int peer_index, const uin
return 0;
}
-static void set_conns_type_close(Group_Chats *g_c, int groupnumber, int friendcon_id, uint8_t type)
+static void set_conns_type_close(Group_Chats *g_c, uint32_t groupnumber, int friendcon_id, uint8_t type)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -681,7 +682,8 @@ static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uin
* return close index on success
* return -1 on failure.
*/
-static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, int groupnumber, uint8_t closest, uint8_t lock)
+static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, uint32_t groupnumber, uint8_t closest,
+ uint8_t lock)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -744,24 +746,24 @@ int add_groupchat(Group_Chats *g_c, uint8_t type)
g->identifier[0] = type;
g->peer_number = 0; /* Founder is peer 0. */
memcpy(g->real_pk, nc_get_self_public_key(g_c->m->net_crypto), CRYPTO_PUBLIC_KEY_SIZE);
- int peer_index = addpeer(g_c, groupnumber, g->real_pk, g_c->m->dht->self_public_key, 0, NULL, false);
+ int peer_index = addpeer(g_c, groupnumber, g->real_pk, dht_get_self_public_key(g_c->m->dht), 0, nullptr, false);
if (peer_index == -1) {
return -1;
}
- setnick(g_c, groupnumber, peer_index, g_c->m->name, g_c->m->name_length, NULL, false);
+ setnick(g_c, groupnumber, peer_index, g_c->m->name, g_c->m->name_length, nullptr, false);
return groupnumber;
}
-static int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t peer_num);
+static int group_kill_peer_send(const Group_Chats *g_c, uint32_t groupnumber, uint16_t peer_num);
/* Delete a groupchat from the chats array.
*
* return 0 on success.
* return -1 if groupnumber is invalid.
*/
-int del_groupchat(Group_Chats *g_c, int groupnumber)
+int del_groupchat(Group_Chats *g_c, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -804,7 +806,7 @@ int del_groupchat(Group_Chats *g_c, int groupnumber)
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
-int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *pk)
+int group_peer_pubkey(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *pk)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -826,7 +828,7 @@ int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, u
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
-int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber)
+int group_peername_size(const Group_Chats *g_c, uint32_t groupnumber, int peernumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -839,7 +841,7 @@ int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber)
}
if (g->group[peernumber].nick_len == 0) {
- return 8;
+ return 0;
}
return g->group[peernumber].nick_len;
@@ -852,7 +854,7 @@ int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber)
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
-int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *name)
+int group_peername(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *name)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -865,8 +867,7 @@ int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint
}
if (g->group[peernumber].nick_len == 0) {
- memcpy(name, "Tox User", 8);
- return 8;
+ return 0;
}
memcpy(name, g->group[peernumber].nick, g->group[peernumber].nick_len);
@@ -883,7 +884,7 @@ int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint
*
* return -1 on failure.
*/
-int group_names(const Group_Chats *g_c, int groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[],
+int group_names(const Group_Chats *g_c, uint32_t groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[],
uint16_t length)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -904,7 +905,7 @@ int group_names(const Group_Chats *g_c, int groupnumber, uint8_t names[][MAX_NAM
/* Return the number of peers in the group chat on success.
* return -1 if groupnumber is invalid.
*/
-int group_number_peers(const Group_Chats *g_c, int groupnumber)
+int group_number_peers(const Group_Chats *g_c, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -921,7 +922,7 @@ int group_number_peers(const Group_Chats *g_c, int groupnumber)
* return -2 if peernumber is invalid.
* return -3 if we are not connected to the group chat.
*/
-int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernumber)
+int group_peernumber_is_ours(const Group_Chats *g_c, uint32_t groupnumber, int peernumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -945,7 +946,7 @@ int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernu
* return -1 on failure.
* return type on success.
*/
-int group_get_type(const Group_Chats *g_c, int groupnumber)
+int group_get_type(const Group_Chats *g_c, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1010,7 +1011,7 @@ static unsigned int send_lossy_group_peer(Friend_Connections *fr_c, int friendco
* return -1 if groupnumber is invalid.
* return -2 if invite packet failed to send.
*/
-int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber)
+int invite_friend(Group_Chats *g_c, uint32_t friendnumber, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1046,7 +1047,7 @@ static unsigned int send_peer_query(Group_Chats *g_c, int friendcon_id, uint16_t
* return -5 if group instance failed to initialize.
* return -6 if join packet fails to send.
*/
-int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length)
+int join_groupchat(Group_Chats *g_c, uint32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length)
{
if (length != sizeof(uint16_t) + GROUP_IDENTIFIER_LENGTH) {
return -1;
@@ -1109,9 +1110,10 @@ int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type
*
* NOTE: Handler must return 0 if packet is to be relayed, -1 if the packet should not be relayed.
*
- * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length)
+ * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length)
*/
-void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, int, int, void *,
+void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, uint32_t, uint32_t,
+ void *,
const uint8_t *, uint16_t))
{
g_c->lossy_packethandlers[byte].function = function;
@@ -1119,7 +1121,7 @@ void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*fu
/* Set the callback for group invites.
*
- * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata)
+ * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, size_t length, void *userdata)
*
* data of length is what needs to be passed to join_groupchat().
*/
@@ -1129,9 +1131,10 @@ void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, ui
g_c->invite_callback = function;
}
+// TODO(sudden6): function signatures in comments are incorrect
/* Set the callback for group messages.
*
- * Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata)
+ * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t friendgroupnumber, uint8_t * message, size_t length, void *userdata)
*/
void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, int, const uint8_t *,
size_t, void *))
@@ -1139,16 +1142,28 @@ void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, u
g_c->message_callback = function;
}
-/* Set callback function for peer name list changes.
+/* Set callback function for peer nickname changes.
+ *
+ * It gets called every time a peer changes their nickname.
+ * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t peernumber, const uint8_t *nick, size_t nick_len, void *userdata)
+ */
+void g_callback_peer_name(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, const uint8_t *,
+ size_t, void *))
+{
+ g_c->peer_name_callback = function;
+}
+
+/* Set callback function for peer list changes.
*
- * It gets called every time the name list changes(new peer/name, deleted peer)
- * Function(Group_Chats *g_c, int groupnumber, int peernumber, TOX_CHAT_CHANGE change, void *userdata)
+ * It gets called every time the name list changes(new peer, deleted peer)
+ * Function(Group_Chats *g_c, uint32_t groupnumber, void *userdata)
*/
-void g_callback_group_namelistchange(Group_Chats *g_c, void (*function)(Messenger *m, int, int, uint8_t, void *))
+void g_callback_peer_list_changed(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, void *))
{
- g_c->group_namelistchange = function;
+ g_c->peer_list_changed_callback = function;
}
+// TODO(sudden6): function signatures are incorrect
/* Set callback function for title changes.
*
* Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * title, uint8_t length, void *userdata)
@@ -1162,12 +1177,13 @@ void g_callback_group_title(Group_Chats *g_c, void (*function)(Messenger *m, uin
/* Set a function to be called when a new peer joins a group chat.
*
- * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber)
+ * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber)
*
* return 0 on success.
* return -1 on failure.
*/
-int callback_groupchat_peer_new(const Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int))
+int callback_groupchat_peer_new(const Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t,
+ uint32_t))
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1181,12 +1197,13 @@ int callback_groupchat_peer_new(const Group_Chats *g_c, int groupnumber, void (*
/* Set a function to be called when a peer leaves a group chat.
*
- * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object))
+ * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object))
*
* return 0 on success.
* return -1 on failure.
*/
-int callback_groupchat_peer_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int, void *))
+int callback_groupchat_peer_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t, uint32_t,
+ void *))
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1205,7 +1222,7 @@ int callback_groupchat_peer_delete(Group_Chats *g_c, int groupnumber, void (*fun
* return 0 on success.
* return -1 on failure.
*/
-int callback_groupchat_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int))
+int callback_groupchat_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t))
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1217,13 +1234,13 @@ int callback_groupchat_delete(Group_Chats *g_c, int groupnumber, void (*function
return 0;
}
-static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t message_id, const uint8_t *data,
+static int send_message_group(const Group_Chats *g_c, uint32_t groupnumber, uint8_t message_id, const uint8_t *data,
uint16_t len);
#define GROUP_MESSAGE_PING_ID 0
-static int group_ping_send(const Group_Chats *g_c, int groupnumber)
+static int group_ping_send(const Group_Chats *g_c, uint32_t groupnumber)
{
- if (send_message_group(g_c, groupnumber, GROUP_MESSAGE_PING_ID, 0, 0) > 0) {
+ if (send_message_group(g_c, groupnumber, GROUP_MESSAGE_PING_ID, nullptr, 0) > 0) {
return 0;
}
@@ -1236,7 +1253,7 @@ static int group_ping_send(const Group_Chats *g_c, int groupnumber)
* return 0 on success
* return -1 on failure
*/
-static int group_new_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t peer_num, const uint8_t *real_pk,
+static int group_new_peer_send(const Group_Chats *g_c, uint32_t groupnumber, uint16_t peer_num, const uint8_t *real_pk,
uint8_t *temp_pk)
{
uint8_t packet[GROUP_MESSAGE_NEW_PEER_LENGTH];
@@ -1260,7 +1277,7 @@ static int group_new_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t
* return 0 on success
* return -1 on failure
*/
-static int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t peer_num)
+static int group_kill_peer_send(const Group_Chats *g_c, uint32_t groupnumber, uint16_t peer_num)
{
uint8_t packet[GROUP_MESSAGE_KILL_PEER_LENGTH];
@@ -1280,7 +1297,7 @@ static int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_
* return 0 on success
* return -1 on failure
*/
-static int group_name_send(const Group_Chats *g_c, int groupnumber, const uint8_t *nick, uint16_t nick_len)
+static int group_name_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *nick, uint16_t nick_len)
{
if (nick_len > MAX_NAME_LENGTH) {
return -1;
@@ -1301,7 +1318,7 @@ static int group_name_send(const Group_Chats *g_c, int groupnumber, const uint8_
* return -2 if title is too long or empty.
* return -3 if packet fails to send.
*/
-int group_title_send(const Group_Chats *g_c, int groupnumber, const uint8_t *title, uint8_t title_len)
+int group_title_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *title, uint8_t title_len)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1336,7 +1353,7 @@ int group_title_send(const Group_Chats *g_c, int groupnumber, const uint8_t *tit
* return -1 of groupnumber is invalid.
* return -2 if title is too long or empty.
*/
-int group_title_get_size(const Group_Chats *g_c, int groupnumber)
+int group_title_get_size(const Group_Chats *g_c, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1358,7 +1375,7 @@ int group_title_get_size(const Group_Chats *g_c, int groupnumber)
* return -1 if groupnumber is invalid.
* return -2 if title is too long or empty.
*/
-int group_title_get(const Group_Chats *g_c, int groupnumber, uint8_t *title)
+int group_title_get(const Group_Chats *g_c, uint32_t groupnumber, uint8_t *title)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1524,6 +1541,11 @@ static int handle_packet_online(Group_Chats *g_c, int friendcon_id, const uint8_
}
int groupnumber = get_group_num(g_c, data + sizeof(uint16_t));
+
+ if (groupnumber == -1) {
+ return -1;
+ }
+
uint16_t other_groupnum;
memcpy(&other_groupnum, data, sizeof(uint16_t));
other_groupnum = net_ntohs(other_groupnum);
@@ -1600,12 +1622,12 @@ static unsigned int send_peer_query(Group_Chats *g_c, int friendcon_id, uint16_t
/* return number of peers sent on success.
* return 0 on failure.
*/
-static unsigned int send_peers(Group_Chats *g_c, int groupnumber, int friendcon_id, uint16_t group_num)
+static unsigned int send_peers(Group_Chats *g_c, uint32_t groupnumber, int friendcon_id, uint16_t group_num)
{
Group_c *g = get_group_c(g_c, groupnumber);
if (!g) {
- return -1;
+ return 0;
}
uint8_t packet[MAX_CRYPTO_DATA_SIZE - (1 + sizeof(uint16_t))];
@@ -1655,7 +1677,8 @@ static unsigned int send_peers(Group_Chats *g_c, int groupnumber, int friendcon_
return sent;
}
-static int handle_send_peers(Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length, void *userdata)
+static int handle_send_peers(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length,
+ void *userdata)
{
if (length == 0) {
return -1;
@@ -1702,7 +1725,7 @@ static int handle_send_peers(Group_Chats *g_c, int groupnumber, const uint8_t *d
return 0;
}
-static void handle_direct_packet(Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length,
+static void handle_direct_packet(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length,
int close_index, void *userdata)
{
if (length == 0) {
@@ -1758,7 +1781,7 @@ static void handle_direct_packet(Group_Chats *g_c, int groupnumber, const uint8_
*
* return number of messages sent.
*/
-static unsigned int send_message_all_close(const Group_Chats *g_c, int groupnumber, const uint8_t *data,
+static unsigned int send_message_all_close(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data,
uint16_t length, int receiver)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1792,7 +1815,8 @@ static unsigned int send_message_all_close(const Group_Chats *g_c, int groupnumb
*
* return number of messages sent.
*/
-static unsigned int send_lossy_all_close(const Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length,
+static unsigned int send_lossy_all_close(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data,
+ uint16_t length,
int receiver)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1885,7 +1909,7 @@ static unsigned int send_lossy_all_close(const Group_Chats *g_c, int groupnumber
* return -3 if we are not connected to the group.
* reutrn -4 if message failed to send.
*/
-static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t message_id, const uint8_t *data,
+static int send_message_group(const Group_Chats *g_c, uint32_t groupnumber, uint8_t message_id, const uint8_t *data,
uint16_t len)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -1930,7 +1954,7 @@ static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t m
* return 0 on success
* see: send_message_group() for error codes.
*/
-int group_message_send(const Group_Chats *g_c, int groupnumber, const uint8_t *message, uint16_t length)
+int group_message_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *message, uint16_t length)
{
int ret = send_message_group(g_c, groupnumber, PACKET_ID_MESSAGE, message, length);
@@ -1945,7 +1969,7 @@ int group_message_send(const Group_Chats *g_c, int groupnumber, const uint8_t *m
* return 0 on success
* see: send_message_group() for error codes.
*/
-int group_action_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length)
+int group_action_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *action, uint16_t length)
{
int ret = send_message_group(g_c, groupnumber, PACKET_ID_ACTION, action, length);
@@ -1956,27 +1980,12 @@ int group_action_send(const Group_Chats *g_c, int groupnumber, const uint8_t *ac
return ret;
}
-/* send a group correction message
- * return 0 on success
- * see: send_message_group() for error codes.
- */
-int group_correction_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length)
-{
- int ret = send_message_group(g_c, groupnumber, PACKET_ID_CORRECTION, action, length);
-
- if (ret > 0) {
- return 0;
- }
-
- return ret;
-}
-
/* High level function to send custom lossy packets.
*
* return -1 on failure.
* return 0 on success.
*/
-int send_group_lossy_packet(const Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length)
+int send_group_lossy_packet(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length)
{
// TODO(irungentoo): length check here?
Group_c *g = get_group_c(g_c, groupnumber);
@@ -2000,7 +2009,7 @@ int send_group_lossy_packet(const Group_Chats *g_c, int groupnumber, const uint8
return 0;
}
-static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length,
+static void handle_message_packet_group(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length,
int close_index, void *userdata)
{
if (length < sizeof(uint16_t) + sizeof(uint32_t) + 1) {
@@ -2098,9 +2107,24 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const
}
break;
- case PACKET_ID_MESSAGE:
- case PACKET_ID_ACTION:
- case PACKET_ID_CORRECTION: {
+ case PACKET_ID_MESSAGE: {
+ if (msg_data_len == 0) {
+ return;
+ }
+
+ VLA(uint8_t, newmsg, msg_data_len + 1);
+ memcpy(newmsg, msg_data, msg_data_len);
+ newmsg[msg_data_len] = 0;
+
+ // TODO(irungentoo):
+ if (g_c->message_callback) {
+ g_c->message_callback(g_c->m, groupnumber, index, 0, newmsg, msg_data_len, userdata);
+ }
+
+ break;
+ }
+
+ case PACKET_ID_ACTION: {
if (msg_data_len == 0) {
return;
}
@@ -2111,9 +2135,7 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const
// TODO(irungentoo):
if (g_c->message_callback) {
- uint8_t chat_message_id = message_id - PACKET_ID_MESSAGE;
- g_c->message_callback(g_c->m, groupnumber, index, chat_message_id,
- newmsg, msg_data_len, userdata);
+ g_c->message_callback(g_c->m, groupnumber, index, 1, newmsg, msg_data_len, userdata);
}
break;
@@ -2188,6 +2210,7 @@ static int g_handle_packet(void *object, int friendcon_id, const uint8_t *data,
static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16_t message_number)
{
if (peer_index == -1) {
+ // TODO(sudden6): invalid return value
return -1;
}
@@ -2208,6 +2231,7 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16
}
if ((uint16_t)(message_number - g->group[peer_index].bottom_lossy_number) > (1 << 15)) {
+ // TODO(sudden6): invalid return value
return -1;
}
@@ -2218,10 +2242,9 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16
g->group[peer_index].top_lossy_number = message_number;
g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1;
g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1;
- return 0;
- }
- if (top_distance < MAX_LOSSY_COUNT) {
+ return 0;
+ } else { // top_distance < MAX_LOSSY_COUNT
unsigned int i;
for (i = g->group[peer_index].bottom_lossy_number; i != (g->group[peer_index].bottom_lossy_number + top_distance);
@@ -2232,10 +2255,9 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16
g->group[peer_index].top_lossy_number = message_number;
g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1;
g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1;
+
return 0;
}
-
- return -1;
}
static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uint16_t length, void *userdata)
@@ -2308,7 +2330,7 @@ static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uin
* return 0 on success.
* return -1 on failure
*/
-int group_set_object(const Group_Chats *g_c, int groupnumber, void *object)
+int group_set_object(const Group_Chats *g_c, uint32_t groupnumber, void *object)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -2325,7 +2347,7 @@ int group_set_object(const Group_Chats *g_c, int groupnumber, void *object)
* return 0 on success.
* return -1 on failure
*/
-int group_peer_set_object(const Group_Chats *g_c, int groupnumber, int peernumber, void *object)
+int group_peer_set_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, void *object)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -2346,12 +2368,12 @@ int group_peer_set_object(const Group_Chats *g_c, int groupnumber, int peernumbe
* return NULL on failure.
* return object on success.
*/
-void *group_get_object(const Group_Chats *g_c, int groupnumber)
+void *group_get_object(const Group_Chats *g_c, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
if (!g) {
- return NULL;
+ return nullptr;
}
return g->object;
@@ -2362,16 +2384,16 @@ void *group_get_object(const Group_Chats *g_c, int groupnumber)
* return NULL on failure.
* return object on success.
*/
-void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernumber)
+void *group_peer_get_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
if (!g) {
- return NULL;
+ return nullptr;
}
if ((uint32_t)peernumber >= g->numpeers) {
- return NULL;
+ return nullptr;
}
return g->group[peernumber].object;
@@ -2380,7 +2402,7 @@ void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernum
/* Interval in seconds to send ping messages */
#define GROUP_PING_INTERVAL 20
-static int ping_groupchat(Group_Chats *g_c, int groupnumber)
+static int ping_groupchat(Group_Chats *g_c, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -2397,7 +2419,7 @@ static int ping_groupchat(Group_Chats *g_c, int groupnumber)
return 0;
}
-static int groupchat_clear_timedout(Group_Chats *g_c, int groupnumber, void *userdata)
+static int groupchat_clear_timedout(Group_Chats *g_c, uint32_t groupnumber, void *userdata)
{
Group_c *g = get_group_c(g_c, groupnumber);
@@ -2412,7 +2434,7 @@ static int groupchat_clear_timedout(Group_Chats *g_c, int groupnumber, void *use
delpeer(g_c, groupnumber, i, userdata);
}
- if (g->group == NULL || i >= g->numpeers) {
+ if (g->group == nullptr || i >= g->numpeers) {
break;
}
}
@@ -2443,13 +2465,13 @@ void send_name_all_groups(Group_Chats *g_c)
Group_Chats *new_groupchats(Messenger *m)
{
if (!m) {
- return NULL;
+ return nullptr;
}
Group_Chats *temp = (Group_Chats *)calloc(1, sizeof(Group_Chats));
- if (temp == NULL) {
- return NULL;
+ if (temp == nullptr) {
+ return nullptr;
}
temp->m = m;
@@ -2491,8 +2513,8 @@ void kill_groupchats(Group_Chats *g_c)
del_groupchat(g_c, i);
}
- m_callback_conference_invite(g_c->m, NULL);
- g_c->m->conferences_object = NULL;
+ m_callback_conference_invite(g_c->m, nullptr);
+ g_c->m->conferences_object = nullptr;
free(g_c);
}
diff --git a/protocols/Tox/libtox/src/toxcore/group.h b/protocols/Tox/libtox/src/toxcore/group.h
index 6c0baebffb..a81dac39db 100644
--- a/protocols/Tox/libtox/src/toxcore/group.h
+++ b/protocols/Tox/libtox/src/toxcore/group.h
@@ -103,9 +103,9 @@ typedef struct {
void *object;
- void (*peer_on_join)(void *, int, int);
- void (*peer_on_leave)(void *, int, int, void *);
- void (*group_on_delete)(void *, int);
+ void (*peer_on_join)(void *, uint32_t, uint32_t);
+ void (*peer_on_leave)(void *, uint32_t, uint32_t, void *);
+ void (*group_on_delete)(void *, uint32_t);
} Group_c;
typedef struct {
@@ -117,17 +117,18 @@ typedef struct {
void (*invite_callback)(Messenger *m, uint32_t, int, const uint8_t *, size_t, void *);
void (*message_callback)(Messenger *m, uint32_t, uint32_t, int, const uint8_t *, size_t, void *);
- void (*group_namelistchange)(Messenger *m, int, int, uint8_t, void *);
+ void (*peer_name_callback)(Messenger *m, uint32_t, uint32_t, const uint8_t *, size_t, void *);
+ void (*peer_list_changed_callback)(Messenger *m, uint32_t, void *);
void (*title_callback)(Messenger *m, uint32_t, uint32_t, const uint8_t *, size_t, void *);
struct {
- int (*function)(void *, int, int, void *, const uint8_t *, uint16_t);
+ int (*function)(void *, uint32_t, uint32_t, void *, const uint8_t *, uint16_t);
} lossy_packethandlers[256];
} Group_Chats;
/* Set the callback for group invites.
*
- * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata)
+ * Function(Group_Chats *g_c, uint32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata)
*
* data of length is what needs to be passed to join_groupchat().
*/
@@ -136,7 +137,7 @@ void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, ui
/* Set the callback for group messages.
*
- * Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata)
+ * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t friendgroupnumber, uint8_t * message, uint16_t length, void *userdata)
*/
void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, int, const uint8_t *,
size_t, void *));
@@ -144,23 +145,26 @@ void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, u
/* Set callback function for title changes.
*
- * Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * title, uint8_t length, void *userdata)
+ * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t friendgroupnumber, uint8_t * title, uint8_t length, void *userdata)
* if friendgroupnumber == -1, then author is unknown (e.g. initial joining the group)
*/
void g_callback_group_title(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, const uint8_t *,
size_t, void *));
-/* Set callback function for peer name list changes.
+/* Set callback function for peer nickname changes.
*
- * It gets called every time the name list changes(new peer/name, deleted peer)
- * Function(Group_Chats *g_c, int groupnumber, int peernumber, TOX_CHAT_CHANGE change, void *userdata)
+ * It gets called every time a peer changes their nickname.
+ * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t peernumber, const uint8_t *nick, size_t nick_len, void *userdata)
*/
-enum {
- CHAT_CHANGE_PEER_ADD,
- CHAT_CHANGE_PEER_DEL,
- CHAT_CHANGE_PEER_NAME,
-};
-void g_callback_group_namelistchange(Group_Chats *g_c, void (*function)(Messenger *m, int, int, uint8_t, void *));
+void g_callback_peer_name(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, const uint8_t *,
+ size_t, void *));
+
+/* Set callback function for peer list changes.
+ *
+ * It gets called every time the name list changes(new peer, deleted peer)
+ * Function(Group_Chats *g_c, uint32_t groupnumber, void *userdata)
+ */
+void g_callback_peer_list_changed(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, void *));
/* Creates a new groupchat and puts it in the chats array.
*
@@ -176,7 +180,7 @@ int add_groupchat(Group_Chats *g_c, uint8_t type);
* return 0 on success.
* return -1 if groupnumber is invalid.
*/
-int del_groupchat(Group_Chats *g_c, int groupnumber);
+int del_groupchat(Group_Chats *g_c, uint32_t groupnumber);
/* Copy the public key of peernumber who is in groupnumber to pk.
* pk must be CRYPTO_PUBLIC_KEY_SIZE long.
@@ -185,7 +189,7 @@ int del_groupchat(Group_Chats *g_c, int groupnumber);
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
-int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *pk);
+int group_peer_pubkey(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *pk);
/*
* Return the size of peernumber's name.
@@ -193,7 +197,7 @@ int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, u
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
-int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber);
+int group_peername_size(const Group_Chats *g_c, uint32_t groupnumber, int32_t peernumber);
/* Copy the name of peernumber who is in groupnumber to name.
* name must be at least MAX_NAME_LENGTH long.
@@ -202,7 +206,7 @@ int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber)
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
-int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *name);
+int group_peername(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *name);
/* invite friendnumber to groupnumber
*
@@ -210,7 +214,7 @@ int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint
* return -1 if groupnumber is invalid.
* return -2 if invite packet failed to send.
*/
-int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber);
+int invite_friend(Group_Chats *g_c, uint32_t friendnumber, uint32_t groupnumber);
/* Join a group (you need to have been invited first.)
*
@@ -224,25 +228,20 @@ int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber);
* return -5 if group instance failed to initialize.
* return -6 if join packet fails to send.
*/
-int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length);
+int join_groupchat(Group_Chats *g_c, uint32_t friendnumber, uint8_t expected_type, const uint8_t *data,
+ uint16_t length);
/* send a group message
* return 0 on success
* see: send_message_group() for error codes.
*/
-int group_message_send(const Group_Chats *g_c, int groupnumber, const uint8_t *message, uint16_t length);
+int group_message_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *message, uint16_t length);
/* send a group action
* return 0 on success
* see: send_message_group() for error codes.
*/
-int group_action_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length);
-
-/* send a group correction message
- * return 0 on success
- * see: send_message_group() for error codes.
- */
-int group_correction_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length);
+int group_action_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *action, uint16_t length);
/* set the group's title, limited to MAX_NAME_LENGTH
* return 0 on success
@@ -250,14 +249,14 @@ int group_correction_send(const Group_Chats *g_c, int groupnumber, const uint8_t
* return -2 if title is too long or empty.
* return -3 if packet fails to send.
*/
-int group_title_send(const Group_Chats *g_c, int groupnumber, const uint8_t *title, uint8_t title_len);
+int group_title_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *title, uint8_t title_len);
/* return the group's title size.
* return -1 of groupnumber is invalid.
* return -2 if title is too long or empty.
*/
-int group_title_get_size(const Group_Chats *g_c, int groupnumber);
+int group_title_get_size(const Group_Chats *g_c, uint32_t groupnumber);
/* Get group title from groupnumber and put it in title.
* Title needs to be a valid memory location with a size of at least MAX_NAME_LENGTH (128) bytes.
@@ -266,12 +265,12 @@ int group_title_get_size(const Group_Chats *g_c, int groupnumber);
* return -1 if groupnumber is invalid.
* return -2 if title is too long or empty.
*/
-int group_title_get(const Group_Chats *g_c, int groupnumber, uint8_t *title);
+int group_title_get(const Group_Chats *g_c, uint32_t groupnumber, uint8_t *title);
/* Return the number of peers in the group chat on success.
* return -1 if groupnumber is invalid.
*/
-int group_number_peers(const Group_Chats *g_c, int groupnumber);
+int group_number_peers(const Group_Chats *g_c, uint32_t groupnumber);
/* return 1 if the peernumber corresponds to ours.
* return 0 if the peernumber is not ours.
@@ -279,7 +278,7 @@ int group_number_peers(const Group_Chats *g_c, int groupnumber);
* return -2 if peernumber is invalid.
* return -3 if we are not connected to the group chat.
*/
-int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernumber);
+int group_peernumber_is_ours(const Group_Chats *g_c, uint32_t groupnumber, int peernumber);
/* List all the peers in the group chat.
*
@@ -291,16 +290,17 @@ int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernu
*
* return -1 on failure.
*/
-int group_names(const Group_Chats *g_c, int groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[],
+int group_names(const Group_Chats *g_c, uint32_t groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[],
uint16_t length);
/* Set handlers for custom lossy packets.
*
* NOTE: Handler must return 0 if packet is to be relayed, -1 if the packet should not be relayed.
*
- * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length)
+ * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length)
*/
-void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, int, int, void *,
+void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, uint32_t, uint32_t,
+ void *,
const uint8_t *, uint16_t));
/* High level function to send custom lossy packets.
@@ -308,7 +308,7 @@ void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*fu
* return -1 on failure.
* return 0 on success.
*/
-int send_group_lossy_packet(const Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length);
+int send_group_lossy_packet(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length);
/* Return the number of chats in the instance m.
* You should use this to determine how much memory to allocate
@@ -328,7 +328,7 @@ uint32_t copy_chatlist(Group_Chats *g_c, uint32_t *out_list, uint32_t list_size)
* return -1 on failure.
* return type on success.
*/
-int group_get_type(const Group_Chats *g_c, int groupnumber);
+int group_get_type(const Group_Chats *g_c, uint32_t groupnumber);
/* Send current name (set in messenger) to all online groups.
*/
@@ -339,28 +339,28 @@ void send_name_all_groups(Group_Chats *g_c);
* return 0 on success.
* return -1 on failure
*/
-int group_set_object(const Group_Chats *g_c, int groupnumber, void *object);
+int group_set_object(const Group_Chats *g_c, uint32_t groupnumber, void *object);
/* Set the object that is tied to the group peer.
*
* return 0 on success.
* return -1 on failure
*/
-int group_peer_set_object(const Group_Chats *g_c, int groupnumber, int peernumber, void *object);
+int group_peer_set_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, void *object);
/* Return the object tide to the group chat previously set by group_set_object.
*
* return NULL on failure.
* return object on success.
*/
-void *group_get_object(const Group_Chats *g_c, int groupnumber);
+void *group_get_object(const Group_Chats *g_c, uint32_t groupnumber);
/* Return the object tide to the group chat peer previously set by group_peer_set_object.
*
* return NULL on failure.
* return object on success.
*/
-void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernumber);
+void *group_peer_get_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber);
/* Set a function to be called when a new peer joins a group chat.
*
@@ -369,25 +369,27 @@ void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernum
* return 0 on success.
* return -1 on failure.
*/
-int callback_groupchat_peer_new(const Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int));
+int callback_groupchat_peer_new(const Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t,
+ uint32_t));
/* Set a function to be called when a peer leaves a group chat.
*
- * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object))
+ * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object))
*
* return 0 on success.
* return -1 on failure.
*/
-int callback_groupchat_peer_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int, void *));
+int callback_groupchat_peer_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t, uint32_t,
+ void *));
/* Set a function to be called when the group chat is deleted.
*
- * Function(void *group object (set with group_set_object), int groupnumber)
+ * Function(void *group object (set with group_set_object), uint32_t groupnumber)
*
* return 0 on success.
* return -1 on failure.
*/
-int callback_groupchat_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int));
+int callback_groupchat_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t));
/* Create new groupchat instance. */
Group_Chats *new_groupchats(Messenger *m);
diff --git a/protocols/Tox/libtox/src/toxcore/list.c b/protocols/Tox/libtox/src/toxcore/list.c
index 36d609fbd1..8fd1f5fb4c 100644
--- a/protocols/Tox/libtox/src/toxcore/list.c
+++ b/protocols/Tox/libtox/src/toxcore/list.c
@@ -29,6 +29,8 @@
#include "list.h"
+#include "ccompat.h"
+
/* Basically, the elements in the list are placed in order so that they can be searched for easily
* -each element is seen as a big-endian integer when ordering them
* -the ids array is maintained so that each id always matches
@@ -148,8 +150,8 @@ int bs_list_init(BS_LIST *list, uint32_t element_size, uint32_t initial_capacity
list->n = 0;
list->element_size = element_size;
list->capacity = 0;
- list->data = NULL;
- list->ids = NULL;
+ list->data = nullptr;
+ list->ids = nullptr;
if (initial_capacity != 0) {
if (!resize(list, initial_capacity)) {
@@ -166,10 +168,10 @@ void bs_list_free(BS_LIST *list)
{
//free both arrays
free(list->data);
- list->data = NULL;
+ list->data = nullptr;
free(list->ids);
- list->ids = NULL;
+ list->ids = nullptr;
}
int bs_list_find(const BS_LIST *list, const uint8_t *data)
diff --git a/protocols/Tox/libtox/src/toxcore/logger.h b/protocols/Tox/libtox/src/toxcore/logger.h
index 8c8a639bec..b3a8f7dc28 100644
--- a/protocols/Tox/libtox/src/toxcore/logger.h
+++ b/protocols/Tox/libtox/src/toxcore/logger.h
@@ -26,6 +26,8 @@
#include <stdint.h>
+#include "ccompat.h"
+
#ifndef MIN_LOGGER_LEVEL
#define MIN_LOGGER_LEVEL LOG_INFO
#endif
@@ -59,8 +61,8 @@ void logger_callback_log(Logger *log, logger_cb *function, void *context, void *
/**
* Main write function. If logging disabled does nothing.
*/
-void logger_write(Logger *log, LOGGER_LEVEL level, const char *file, int line, const char *func, const char *format,
- ...);
+void logger_write(
+ Logger *log, LOGGER_LEVEL level, const char *file, int line, const char *func, const char *format, ...) GNU_PRINTF;
#define LOGGER_WRITE(log, level, ...) \
diff --git a/protocols/Tox/libtox/src/toxcore/net_crypto.c b/protocols/Tox/libtox/src/toxcore/net_crypto.c
index 521dad2f1c..65c81d92a0 100644
--- a/protocols/Tox/libtox/src/toxcore/net_crypto.c
+++ b/protocols/Tox/libtox/src/toxcore/net_crypto.c
@@ -180,7 +180,7 @@ static uint8_t crypt_connection_id_not_valid(const Net_Crypto *c, int crypt_conn
return 1;
}
- if (c->crypto_connections == NULL) {
+ if (c->crypto_connections == nullptr) {
return 1;
}
@@ -223,7 +223,7 @@ static int create_cookie_request(const Net_Crypto *c, uint8_t *packet, uint8_t *
uint8_t nonce[CRYPTO_NONCE_SIZE];
random_nonce(nonce);
packet[0] = NET_PACKET_COOKIE_REQUEST;
- memcpy(packet + 1, c->dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE);
+ memcpy(packet + 1, dht_get_self_public_key(c->dht), CRYPTO_PUBLIC_KEY_SIZE);
memcpy(packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, nonce, CRYPTO_NONCE_SIZE);
int len = encrypt_data_symmetric(shared_key, nonce, plain, sizeof(plain),
packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE);
@@ -362,7 +362,7 @@ static int udp_handle_cookie_request(void *object, IP_Port source, const uint8_t
return 1;
}
- if ((uint32_t)sendpacket(c->dht->net, source, data, sizeof(data)) != sizeof(data)) {
+ if ((uint32_t)sendpacket(dht_get_net(c->dht), source, data, sizeof(data)) != sizeof(data)) {
return 1;
}
@@ -551,7 +551,7 @@ static int handle_crypto_handshake(const Net_Crypto *c, uint8_t *nonce, uint8_t
static Crypto_Connection *get_crypto_connection(const Net_Crypto *c, int crypt_connection_id)
{
if (crypt_connection_id_not_valid(c, crypt_connection_id)) {
- return 0;
+ return nullptr;
}
return &c->crypto_connections[crypt_connection_id];
@@ -567,7 +567,7 @@ static int add_ip_port_connection(Net_Crypto *c, int crypt_connection_id, IP_Por
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -607,7 +607,7 @@ static IP_Port return_ip_port_connection(Net_Crypto *c, int crypt_connection_id)
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return empty;
}
@@ -647,7 +647,7 @@ static int send_packet_to(Net_Crypto *c, int crypt_connection_id, const uint8_t
// TODO(irungentoo): TCP, etc...
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -659,10 +659,10 @@ static int send_packet_to(Net_Crypto *c, int crypt_connection_id, const uint8_t
// TODO(irungentoo): on bad networks, direct connections might not last indefinitely.
if (ip_port.ip.family != 0) {
bool direct_connected = 0;
- crypto_connection_status(c, crypt_connection_id, &direct_connected, NULL);
+ crypto_connection_status(c, crypt_connection_id, &direct_connected, nullptr);
if (direct_connected) {
- if ((uint32_t)sendpacket(c->dht->net, ip_port, data, length) == length) {
+ if ((uint32_t)sendpacket(dht_get_net(c->dht), ip_port, data, length) == length) {
pthread_mutex_unlock(&conn->mutex);
return 0;
}
@@ -676,7 +676,7 @@ static int send_packet_to(Net_Crypto *c, int crypt_connection_id, const uint8_t
if ((((UDP_DIRECT_TIMEOUT / 2) + conn->direct_send_attempt_time) > current_time && length < 96)
|| data[0] == NET_PACKET_COOKIE_REQUEST || data[0] == NET_PACKET_CRYPTO_HS) {
- if ((uint32_t)sendpacket(c->dht->net, ip_port, data, length) == length) {
+ if ((uint32_t)sendpacket(dht_get_net(c->dht), ip_port, data, length) == length) {
direct_send_attempt = 1;
conn->direct_send_attempt_time = unix_time();
}
@@ -733,7 +733,7 @@ static int add_data_to_buffer(Packets_Array *array, uint32_t number, const Packe
Packet_Data *new_d = (Packet_Data *)malloc(sizeof(Packet_Data));
- if (new_d == NULL) {
+ if (new_d == nullptr) {
return -1;
}
@@ -784,7 +784,7 @@ static int64_t add_data_end_of_buffer(Packets_Array *array, const Packet_Data *d
Packet_Data *new_d = (Packet_Data *)malloc(sizeof(Packet_Data));
- if (new_d == NULL) {
+ if (new_d == nullptr) {
return -1;
}
@@ -816,7 +816,7 @@ static int64_t read_data_beg_buffer(Packets_Array *array, Packet_Data *data)
uint32_t id = array->buffer_start;
++array->buffer_start;
free(array->buffer[num]);
- array->buffer[num] = NULL;
+ array->buffer[num] = nullptr;
return id;
}
@@ -840,7 +840,7 @@ static int clear_buffer_until(Packets_Array *array, uint32_t number)
if (array->buffer[num]) {
free(array->buffer[num]);
- array->buffer[num] = NULL;
+ array->buffer[num] = nullptr;
}
}
@@ -857,7 +857,7 @@ static int clear_buffer(Packets_Array *array)
if (array->buffer[num]) {
free(array->buffer[num]);
- array->buffer[num] = NULL;
+ array->buffer[num] = nullptr;
}
}
@@ -996,7 +996,7 @@ static int handle_request_packet(Packets_Array *send_array, const uint8_t *data,
}
free(send_array->buffer[num]);
- send_array->buffer[num] = NULL;
+ send_array->buffer[num] = nullptr;
}
}
@@ -1038,7 +1038,7 @@ static int send_data_packet(Net_Crypto *c, int crypt_connection_id, const uint8_
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1087,14 +1087,14 @@ static int reset_max_speed_reached(Net_Crypto *c, int crypt_connection_id)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
/* If last packet send failed, try to send packet again.
If sending it fails we won't be able to send the new packet. */
if (conn->maximum_speed_reached) {
- Packet_Data *dt = NULL;
+ Packet_Data *dt = nullptr;
uint32_t packet_num = conn->send_array.buffer_end - 1;
int ret = get_data_pointer(&conn->send_array, &dt, packet_num);
@@ -1133,7 +1133,7 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1162,7 +1162,7 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons
}
if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, data, length) == 0) {
- Packet_Data *dt1 = NULL;
+ Packet_Data *dt1 = nullptr;
if (get_data_pointer(&conn->send_array, &dt1, packet_num) == 1) {
dt1->sent_time = current_time_monotonic();
@@ -1203,7 +1203,7 @@ static int handle_data_packet(const Net_Crypto *c, int crypt_connection_id, uint
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1238,7 +1238,7 @@ static int send_request_packet(Net_Crypto *c, int crypt_connection_id)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1266,7 +1266,7 @@ static int send_requested_packets(Net_Crypto *c, int crypt_connection_id, uint32
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1318,13 +1318,13 @@ static int new_temp_packet(const Net_Crypto *c, int crypt_connection_id, const u
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
uint8_t *temp_packet = (uint8_t *)malloc(length);
- if (temp_packet == 0) {
+ if (temp_packet == nullptr) {
return -1;
}
@@ -1349,7 +1349,7 @@ static int clear_temp_packet(const Net_Crypto *c, int crypt_connection_id)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1357,7 +1357,7 @@ static int clear_temp_packet(const Net_Crypto *c, int crypt_connection_id)
free(conn->temp_packet);
}
- conn->temp_packet = 0;
+ conn->temp_packet = nullptr;
conn->temp_packet_length = 0;
conn->temp_packet_sent_time = 0;
conn->temp_packet_num_sent = 0;
@@ -1374,7 +1374,7 @@ static int send_temp_packet(Net_Crypto *c, int crypt_connection_id)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1402,7 +1402,7 @@ static int create_send_handshake(Net_Crypto *c, int crypt_connection_id, const u
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1430,7 +1430,7 @@ static int send_kill_packet(Net_Crypto *c, int crypt_connection_id)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1443,7 +1443,7 @@ static void connection_kill(Net_Crypto *c, int crypt_connection_id, void *userda
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return;
}
@@ -1469,7 +1469,7 @@ static int handle_data_packet_core(Net_Crypto *c, int crypt_connection_id, const
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1542,8 +1542,6 @@ static int handle_data_packet_core(Net_Crypto *c, int crypt_connection_id, const
return -1;
}
- // else { /* TODO(irungentoo): ? */ }
-
set_buffer_end(&conn->recv_array, num);
} else if (real_data[0] >= CRYPTO_RESERVED_PACKETS && real_data[0] < PACKET_ID_LOSSY_RANGE_START) {
Packet_Data dt;
@@ -1571,7 +1569,7 @@ static int handle_data_packet_core(Net_Crypto *c, int crypt_connection_id, const
/* conn might get killed in callback. */
conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
}
@@ -1616,7 +1614,7 @@ static int handle_packet_connection(Net_Crypto *c, int crypt_connection_id, cons
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1702,14 +1700,14 @@ static int realloc_cryptoconnection(Net_Crypto *c, uint32_t num)
{
if (num == 0) {
free(c->crypto_connections);
- c->crypto_connections = NULL;
+ c->crypto_connections = nullptr;
return 0;
}
Crypto_Connection *newcrypto_connections = (Crypto_Connection *)realloc(c->crypto_connections,
num * sizeof(Crypto_Connection));
- if (newcrypto_connections == NULL) {
+ if (newcrypto_connections == nullptr) {
return -1;
}
@@ -1756,7 +1754,7 @@ static int create_crypto_connection(Net_Crypto *c)
c->crypto_connections[id].packet_send_rate_requested = 0;
c->crypto_connections[id].last_packets_left_requested_rem = 0;
- if (pthread_mutex_init(&c->crypto_connections[id].mutex, NULL) != 0) {
+ if (pthread_mutex_init(&c->crypto_connections[id].mutex, nullptr) != 0) {
pthread_mutex_unlock(&c->connections_mutex);
return -1;
}
@@ -1831,7 +1829,7 @@ static int crypto_connection_add_source(Net_Crypto *c, int crypt_connection_id,
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -1850,7 +1848,7 @@ static int crypto_connection_add_source(Net_Crypto *c, int crypt_connection_id,
}
if (source.ip.family == TCP_FAMILY) {
- if (add_tcp_number_relay_connection(c->tcp_c, conn->connection_number_tcp, source.ip.ip6.uint32[0]) == 0) {
+ if (add_tcp_number_relay_connection(c->tcp_c, conn->connection_number_tcp, source.ip.ip.v6.uint32[0]) == 0) {
return 1;
}
}
@@ -1884,7 +1882,7 @@ static int handle_new_connection_handshake(Net_Crypto *c, IP_Port source, const
New_Connection n_c;
n_c.cookie = (uint8_t *)malloc(COOKIE_LENGTH);
- if (n_c.cookie == NULL) {
+ if (n_c.cookie == nullptr) {
return -1;
}
@@ -1892,7 +1890,7 @@ static int handle_new_connection_handshake(Net_Crypto *c, IP_Port source, const
n_c.cookie_length = COOKIE_LENGTH;
if (handle_crypto_handshake(c, n_c.recv_nonce, n_c.peersessionpublic_key, n_c.public_key, n_c.dht_public_key,
- n_c.cookie, data, length, 0) != 0) {
+ n_c.cookie, data, length, nullptr) != 0) {
free(n_c.cookie);
return -1;
}
@@ -2009,7 +2007,7 @@ int new_crypto_connection(Net_Crypto *c, const uint8_t *real_public_key, const u
Crypto_Connection *conn = &c->crypto_connections[crypt_connection_id];
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2059,7 +2057,7 @@ int set_direct_ip_port(Net_Crypto *c, int crypt_connection_id, IP_Port ip_port,
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2095,7 +2093,7 @@ static int tcp_data_callback(void *object, int id, const uint8_t *data, uint16_t
Crypto_Connection *conn = get_crypto_connection(c, id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2134,7 +2132,7 @@ static int tcp_oob_callback(void *object, const uint8_t *public_key, unsigned in
IP_Port source;
source.port = 0;
source.ip.family = TCP_FAMILY;
- source.ip.ip6.uint32[0] = tcp_connections_number;
+ source.ip.ip.v6.uint32[0] = tcp_connections_number;
if (handle_new_connection_handshake(c, source, data, length, userdata) != 0) {
return -1;
@@ -2155,7 +2153,7 @@ int add_tcp_relay_peer(Net_Crypto *c, int crypt_connection_id, IP_Port ip_port,
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2239,13 +2237,13 @@ static void do_tcp(Net_Crypto *c, void *userdata)
for (i = 0; i < c->crypto_connections_length; ++i) {
Crypto_Connection *conn = get_crypto_connection(c, i);
- if (conn == 0) {
+ if (conn == nullptr) {
return;
}
if (conn->status == CRYPTO_CONN_ESTABLISHED) {
bool direct_connected = 0;
- crypto_connection_status(c, i, &direct_connected, NULL);
+ crypto_connection_status(c, i, &direct_connected, nullptr);
if (direct_connected) {
pthread_mutex_lock(&c->tcp_mutex);
@@ -2275,7 +2273,7 @@ int connection_status_handler(const Net_Crypto *c, int crypt_connection_id,
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2298,7 +2296,7 @@ int connection_data_handler(const Net_Crypto *c, int crypt_connection_id, int (*
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2322,7 +2320,7 @@ int connection_lossy_data_handler(Net_Crypto *c, int crypt_connection_id,
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2348,7 +2346,7 @@ int nc_dht_pk_callback(Net_Crypto *c, int crypt_connection_id, void (*function)(
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2405,7 +2403,7 @@ static int udp_handle_packet(void *object, IP_Port source, const uint8_t *packet
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2449,7 +2447,7 @@ static void send_crypto_packets(Net_Crypto *c)
for (i = 0; i < c->crypto_connections_length; ++i) {
Crypto_Connection *conn = get_crypto_connection(c, i);
- if (conn == 0) {
+ if (conn == nullptr) {
return;
}
@@ -2517,7 +2515,6 @@ static void send_crypto_packets(Net_Crypto *c)
conn->last_sendqueue_size[pos] = num_packets_array(&conn->send_array);
++conn->last_sendqueue_counter;
- unsigned int j;
long signed int sum = 0;
sum = (long signed int)conn->last_sendqueue_size[(pos) % CONGESTION_QUEUE_ARRAY_SIZE] -
(long signed int)conn->last_sendqueue_size[(pos - (CONGESTION_QUEUE_ARRAY_SIZE - 1)) % CONGESTION_QUEUE_ARRAY_SIZE];
@@ -2527,7 +2524,7 @@ static void send_crypto_packets(Net_Crypto *c)
conn->last_num_packets_resent[n_p_pos] = packets_resent;
bool direct_connected = 0;
- crypto_connection_status(c, i, &direct_connected, NULL);
+ crypto_connection_status(c, i, &direct_connected, nullptr);
if (direct_connected && conn->last_tcp_sent + CONGESTION_EVENT_TIMEOUT > temp_time) {
/* When switching from TCP to UDP, don't change the packet send rate for CONGESTION_EVENT_TIMEOUT ms. */
@@ -2542,7 +2539,7 @@ static void send_crypto_packets(Net_Crypto *c)
delay = packets_set_rem_array;
}
- for (j = 0; j < CONGESTION_QUEUE_ARRAY_SIZE; ++j) {
+ for (unsigned j = 0; j < CONGESTION_QUEUE_ARRAY_SIZE; ++j) {
unsigned int ind = (j + (packets_set_rem_array - delay) + n_p_pos) % CONGESTION_LAST_SENT_ARRAY_SIZE;
total_sent += conn->last_num_packets_sent[ind];
total_resent += conn->last_num_packets_resent[ind];
@@ -2688,7 +2685,7 @@ uint32_t crypto_num_free_sendqueue_slots(const Net_Crypto *c, int crypt_connecti
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return 0;
}
@@ -2725,7 +2722,7 @@ int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2763,7 +2760,7 @@ int cryptpacket_received(Net_Crypto *c, int crypt_connection_id, uint32_t packet
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return -1;
}
@@ -2872,7 +2869,7 @@ unsigned int crypto_connection_status(const Net_Crypto *c, int crypt_connection_
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
- if (conn == 0) {
+ if (conn == nullptr) {
return CRYPTO_CONN_NO_CONNECTION;
}
@@ -2929,33 +2926,33 @@ Net_Crypto *new_net_crypto(Logger *log, DHT *dht, TCP_Proxy_Info *proxy_info)
{
unix_time_update();
- if (dht == NULL) {
- return NULL;
+ if (dht == nullptr) {
+ return nullptr;
}
Net_Crypto *temp = (Net_Crypto *)calloc(1, sizeof(Net_Crypto));
- if (temp == NULL) {
- return NULL;
+ if (temp == nullptr) {
+ return nullptr;
}
temp->log = log;
- temp->tcp_c = new_tcp_connections(dht->self_secret_key, proxy_info);
+ temp->tcp_c = new_tcp_connections(dht_get_self_secret_key(dht), proxy_info);
- if (temp->tcp_c == NULL) {
+ if (temp->tcp_c == nullptr) {
free(temp);
- return NULL;
+ return nullptr;
}
set_packet_tcp_connection_callback(temp->tcp_c, &tcp_data_callback, temp);
set_oob_packet_tcp_connection_callback(temp->tcp_c, &tcp_oob_callback, temp);
if (create_recursive_mutex(&temp->tcp_mutex) != 0 ||
- pthread_mutex_init(&temp->connections_mutex, NULL) != 0) {
+ pthread_mutex_init(&temp->connections_mutex, nullptr) != 0) {
kill_tcp_connections(temp->tcp_c);
free(temp);
- return NULL;
+ return nullptr;
}
temp->dht = dht;
@@ -2965,10 +2962,10 @@ Net_Crypto *new_net_crypto(Logger *log, DHT *dht, TCP_Proxy_Info *proxy_info)
temp->current_sleep_time = CRYPTO_SEND_PACKET_INTERVAL;
- networking_registerhandler(dht->net, NET_PACKET_COOKIE_REQUEST, &udp_handle_cookie_request, temp);
- networking_registerhandler(dht->net, NET_PACKET_COOKIE_RESPONSE, &udp_handle_packet, temp);
- networking_registerhandler(dht->net, NET_PACKET_CRYPTO_HS, &udp_handle_packet, temp);
- networking_registerhandler(dht->net, NET_PACKET_CRYPTO_DATA, &udp_handle_packet, temp);
+ networking_registerhandler(dht_get_net(dht), NET_PACKET_COOKIE_REQUEST, &udp_handle_cookie_request, temp);
+ networking_registerhandler(dht_get_net(dht), NET_PACKET_COOKIE_RESPONSE, &udp_handle_packet, temp);
+ networking_registerhandler(dht_get_net(dht), NET_PACKET_CRYPTO_HS, &udp_handle_packet, temp);
+ networking_registerhandler(dht_get_net(dht), NET_PACKET_CRYPTO_DATA, &udp_handle_packet, temp);
bs_list_init(&temp->ip_port_list, sizeof(IP_Port), 8);
@@ -2983,7 +2980,7 @@ static void kill_timedout(Net_Crypto *c, void *userdata)
for (i = 0; i < c->crypto_connections_length; ++i) {
Crypto_Connection *conn = get_crypto_connection(c, i);
- if (conn == 0) {
+ if (conn == nullptr) {
return;
}
@@ -3039,10 +3036,10 @@ void kill_net_crypto(Net_Crypto *c)
kill_tcp_connections(c->tcp_c);
bs_list_free(&c->ip_port_list);
- networking_registerhandler(c->dht->net, NET_PACKET_COOKIE_REQUEST, NULL, NULL);
- networking_registerhandler(c->dht->net, NET_PACKET_COOKIE_RESPONSE, NULL, NULL);
- networking_registerhandler(c->dht->net, NET_PACKET_CRYPTO_HS, NULL, NULL);
- networking_registerhandler(c->dht->net, NET_PACKET_CRYPTO_DATA, NULL, NULL);
+ networking_registerhandler(dht_get_net(c->dht), NET_PACKET_COOKIE_REQUEST, nullptr, nullptr);
+ networking_registerhandler(dht_get_net(c->dht), NET_PACKET_COOKIE_RESPONSE, nullptr, nullptr);
+ networking_registerhandler(dht_get_net(c->dht), NET_PACKET_CRYPTO_HS, nullptr, nullptr);
+ networking_registerhandler(dht_get_net(c->dht), NET_PACKET_CRYPTO_DATA, nullptr, nullptr);
crypto_memzero(c, sizeof(Net_Crypto));
free(c);
}
diff --git a/protocols/Tox/libtox/src/toxcore/network.c b/protocols/Tox/libtox/src/toxcore/network.c
index fb4748d4ec..e9c82c3930 100644
--- a/protocols/Tox/libtox/src/toxcore/network.c
+++ b/protocols/Tox/libtox/src/toxcore/network.c
@@ -25,10 +25,16 @@
#include "config.h"
#endif
+#ifdef __APPLE__
#define _DARWIN_C_SOURCE
+#endif
+
+#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 600
+#endif
#if defined(_WIN32) && _WIN32_WINNT >= _WIN32_WINNT_WINXP
+#undef _WIN32_WINNT
#define _WIN32_WINNT 0x501
#endif
@@ -46,7 +52,6 @@
#ifndef IPV6_ADD_MEMBERSHIP
#ifdef IPV6_JOIN_GROUP
#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
-#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
#endif
#endif
@@ -79,8 +84,8 @@ static const char *inet_ntop(Family family, const void *addr, char *buf, size_t
DWORD len = bufsize;
- if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), NULL, buf, &len)) {
- return NULL;
+ if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), nullptr, buf, &len)) {
+ return nullptr;
}
return buf;
@@ -93,14 +98,14 @@ static const char *inet_ntop(Family family, const void *addr, char *buf, size_t
DWORD len = bufsize;
- if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), NULL, buf, &len)) {
- return NULL;
+ if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), nullptr, buf, &len)) {
+ return nullptr;
}
return buf;
}
- return NULL;
+ return nullptr;
}
static int inet_pton(Family family, const char *addrString, void *addrbuf)
@@ -111,7 +116,7 @@ static int inet_pton(Family family, const char *addrString, void *addrbuf)
INT len = sizeof(saddr);
- if (WSAStringToAddress((LPTSTR)addrString, AF_INET, NULL, (LPSOCKADDR)&saddr, &len)) {
+ if (WSAStringToAddress((LPTSTR)addrString, AF_INET, nullptr, (LPSOCKADDR)&saddr, &len)) {
return 0;
}
@@ -124,7 +129,7 @@ static int inet_pton(Family family, const char *addrString, void *addrbuf)
INT len = sizeof(saddr);
- if (WSAStringToAddress((LPTSTR)addrString, AF_INET6, NULL, (LPSOCKADDR)&saddr, &len)) {
+ if (WSAStringToAddress((LPTSTR)addrString, AF_INET6, nullptr, (LPSOCKADDR)&saddr, &len)) {
return 0;
}
@@ -182,14 +187,14 @@ const IP6 IP6_BROADCAST = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
};
-IP4 get_ip4_loopback()
+IP4 get_ip4_loopback(void)
{
IP4 loopback;
loopback.uint32 = htonl(INADDR_LOOPBACK);
return loopback;
}
-IP6 get_ip6_loopback()
+IP6 get_ip6_loopback(void)
{
IP6 loopback;
get_ip6(&loopback, &in6addr_loopback);
@@ -303,7 +308,7 @@ static uint64_t current_time_actual(void)
return time / 10;
#else
struct timeval a;
- gettimeofday(&a, NULL);
+ gettimeofday(&a, nullptr);
time = 1000000ULL * a.tv_sec + a.tv_usec;
return time;
#endif
@@ -371,18 +376,18 @@ static void loglogdata(Logger *log, const char *message, const uint8_t *buffer,
char ip_str[IP_NTOA_LEN];
if (res < 0) { /* Windows doesn't necessarily know %zu */
- LOGGER_TRACE(log, "[%2u] %s %3hu%c %s:%hu (%u: %s) | %04x%04x",
- buffer[0], message, (buflen < 999 ? (uint16_t)buflen : 999), 'E',
+ LOGGER_TRACE(log, "[%2u] %s %3u%c %s:%u (%u: %s) | %04x%04x",
+ buffer[0], message, (buflen < 999 ? buflen : 999), 'E',
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), errno,
strerror(errno), data_0(buflen, buffer), data_1(buflen, buffer));
} else if ((res > 0) && ((size_t)res <= buflen)) {
- LOGGER_TRACE(log, "[%2u] %s %3zu%c %s:%hu (%u: %s) | %04x%04x",
- buffer[0], message, (res < 999 ? (size_t)res : 999), ((size_t)res < buflen ? '<' : '='),
+ LOGGER_TRACE(log, "[%2u] %s %3u%c %s:%u (%u: %s) | %04x%04x",
+ buffer[0], message, (res < 999 ? res : 999), ((size_t)res < buflen ? '<' : '='),
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), 0, "OK",
data_0(buflen, buffer), data_1(buflen, buffer));
} else { /* empty or overwrite */
- LOGGER_TRACE(log, "[%2u] %s %zu%c%zu %s:%hu (%u: %s) | %04x%04x",
- buffer[0], message, (size_t)res, (!res ? '!' : '>'), buflen,
+ LOGGER_TRACE(log, "[%2u] %s %u%c%u %s:%u (%u: %s) | %04x%04x",
+ buffer[0], message, res, (!res ? '!' : '>'), buflen,
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), 0, "OK",
data_0(buflen, buffer), data_1(buflen, buffer));
}
@@ -447,7 +452,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, const uint8_t *data, uint1
ip6.uint32[0] = 0;
ip6.uint32[1] = 0;
ip6.uint32[2] = net_htonl(0xFFFF);
- ip6.uint32[3] = ip_port.ip.ip4.uint32;
+ ip6.uint32[3] = ip_port.ip.ip.v4.uint32;
fill_addr6(ip6, &addr6->sin6_addr);
addr6->sin6_flowinfo = 0;
@@ -457,7 +462,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, const uint8_t *data, uint1
addrsize = sizeof(struct sockaddr_in);
addr4->sin_family = AF_INET;
- fill_addr4(ip_port.ip.ip4, &addr4->sin_addr);
+ fill_addr4(ip_port.ip.ip.v4, &addr4->sin_addr);
addr4->sin_port = ip_port.port;
}
} else if (ip_port.ip.family == TOX_AF_INET6) {
@@ -466,7 +471,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, const uint8_t *data, uint1
addrsize = sizeof(struct sockaddr_in6);
addr6->sin6_family = AF_INET6;
addr6->sin6_port = ip_port.port;
- fill_addr6(ip_port.ip.ip6, &addr6->sin6_addr);
+ fill_addr6(ip_port.ip.ip.v6, &addr6->sin6_addr);
addr6->sin6_flowinfo = 0;
addr6->sin6_scope_id = 0;
@@ -514,17 +519,17 @@ static int receivepacket(Logger *log, Socket sock, IP_Port *ip_port, uint8_t *da
struct sockaddr_in *addr_in = (struct sockaddr_in *)&addr;
ip_port->ip.family = make_tox_family(addr_in->sin_family);
- get_ip4(&ip_port->ip.ip4, &addr_in->sin_addr);
+ get_ip4(&ip_port->ip.ip.v4, &addr_in->sin_addr);
ip_port->port = addr_in->sin_port;
} else if (addr.ss_family == AF_INET6) {
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)&addr;
ip_port->ip.family = make_tox_family(addr_in6->sin6_family);
- get_ip6(&ip_port->ip.ip6, &addr_in6->sin6_addr);
+ get_ip6(&ip_port->ip.ip.v6, &addr_in6->sin6_addr);
ip_port->port = addr_in6->sin6_port;
- if (IPV6_IPV4_IN_V6(ip_port->ip.ip6)) {
+ if (IPV6_IPV4_IN_V6(ip_port->ip.ip.v6)) {
ip_port->ip.family = TOX_AF_INET;
- ip_port->ip.ip4.uint32 = ip_port->ip.ip6.uint32[3];
+ ip_port->ip.ip.v4.uint32 = ip_port->ip.ip.v6.uint32[3];
}
} else {
return -1;
@@ -621,7 +626,7 @@ static void at_shutdown(void)
*/
Networking_Core *new_networking(Logger *log, IP ip, uint16_t port)
{
- return new_networking_ex(log, ip, port, port + (TOX_PORTRANGE_TO - TOX_PORTRANGE_FROM), 0);
+ return new_networking_ex(log, ip, port, port + (TOX_PORTRANGE_TO - TOX_PORTRANGE_FROM), nullptr);
}
/* Initialize networking.
@@ -660,17 +665,17 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
/* maybe check for invalid IPs like 224+.x.y.z? if there is any IP set ever */
if (ip.family != TOX_AF_INET && ip.family != TOX_AF_INET6) {
LOGGER_ERROR(log, "Invalid address family: %u\n", ip.family);
- return NULL;
+ return nullptr;
}
if (networking_at_startup() != 0) {
- return NULL;
+ return nullptr;
}
Networking_Core *temp = (Networking_Core *)calloc(1, sizeof(Networking_Core));
- if (temp == NULL) {
- return NULL;
+ if (temp == nullptr) {
+ return nullptr;
}
temp->log = log;
@@ -690,7 +695,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
*error = 1;
}
- return NULL;
+ return nullptr;
}
/* Functions to increase the size of the send and receive UDP buffers.
@@ -711,7 +716,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
*error = 1;
}
- return NULL;
+ return nullptr;
}
/* Set socket nonblocking. */
@@ -722,11 +727,11 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
*error = 1;
}
- return NULL;
+ return nullptr;
}
/* Bind our socket to port PORT and the given IP address (usually 0.0.0.0 or ::) */
- uint16_t *portptr = NULL;
+ uint16_t *portptr = nullptr;
struct sockaddr_storage addr;
size_t addrsize;
@@ -738,7 +743,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
addrsize = sizeof(struct sockaddr_in);
addr4->sin_family = AF_INET;
addr4->sin_port = 0;
- fill_addr4(ip.ip4, &addr4->sin_addr);
+ fill_addr4(ip.ip.v4, &addr4->sin_addr);
portptr = &addr4->sin_port;
} else if (temp->family == TOX_AF_INET6) {
@@ -747,7 +752,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
addrsize = sizeof(struct sockaddr_in6);
addr6->sin6_family = AF_INET6;
addr6->sin6_port = 0;
- fill_addr6(ip.ip6, &addr6->sin6_addr);
+ fill_addr6(ip.ip.v6, &addr6->sin6_addr);
addr6->sin6_flowinfo = 0;
addr6->sin6_scope_id = 0;
@@ -755,7 +760,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
portptr = &addr6->sin6_port;
} else {
free(temp);
- return NULL;
+ return nullptr;
}
if (ip.family == TOX_AF_INET6) {
@@ -838,7 +843,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
*error = 1;
}
- return NULL;
+ return nullptr;
}
Networking_Core *new_networking_no_udp(Logger *log)
@@ -846,8 +851,8 @@ Networking_Core *new_networking_no_udp(Logger *log)
/* this is the easiest way to completely disable UDP without changing too much code. */
Networking_Core *net = (Networking_Core *)calloc(1, sizeof(Networking_Core));
- if (net == NULL) {
- return NULL;
+ if (net == nullptr) {
+ return nullptr;
}
net->log = log;
@@ -887,14 +892,14 @@ int ip_equal(const IP *a, const IP *b)
if (a->family == TOX_AF_INET || a->family == TCP_INET) {
struct in_addr addr_a;
struct in_addr addr_b;
- fill_addr4(a->ip4, &addr_a);
- fill_addr4(b->ip4, &addr_b);
+ fill_addr4(a->ip.v4, &addr_a);
+ fill_addr4(b->ip.v4, &addr_b);
return addr_a.s_addr == addr_b.s_addr;
}
if (a->family == TOX_AF_INET6 || a->family == TCP_INET6) {
- return a->ip6.uint64[0] == b->ip6.uint64[0] &&
- a->ip6.uint64[1] == b->ip6.uint64[1];
+ return a->ip.v6.uint64[0] == b->ip.v6.uint64[0] &&
+ a->ip.v6.uint64[1] == b->ip.v6.uint64[1];
}
return 0;
@@ -902,16 +907,16 @@ int ip_equal(const IP *a, const IP *b)
/* different family: check on the IPv6 one if it is the IPv4 one embedded */
if ((a->family == TOX_AF_INET) && (b->family == TOX_AF_INET6)) {
- if (IPV6_IPV4_IN_V6(b->ip6)) {
+ if (IPV6_IPV4_IN_V6(b->ip.v6)) {
struct in_addr addr_a;
- fill_addr4(a->ip4, &addr_a);
- return addr_a.s_addr == b->ip6.uint32[3];
+ fill_addr4(a->ip.v4, &addr_a);
+ return addr_a.s_addr == b->ip.v6.uint32[3];
}
} else if ((a->family == TOX_AF_INET6) && (b->family == TOX_AF_INET)) {
- if (IPV6_IPV4_IN_V6(a->ip6)) {
+ if (IPV6_IPV4_IN_V6(a->ip.v6)) {
struct in_addr addr_b;
- fill_addr4(b->ip4, &addr_b);
- return a->ip6.uint32[3] == addr_b.s_addr;
+ fill_addr4(b->ip.v4, &addr_b);
+ return a->ip.v6.uint32[3] == addr_b.s_addr;
}
}
@@ -948,7 +953,7 @@ void ip_reset(IP *ip)
}
/* nulls out ip, sets family according to flag */
-void ip_init(IP *ip, uint8_t ipv6enabled)
+void ip_init(IP *ip, bool ipv6enabled)
{
if (!ip) {
return;
@@ -1024,14 +1029,14 @@ const char *ip_ntoa(const IP *ip, char *ip_str, size_t length)
if (ip->family == TOX_AF_INET) {
/* returns standard quad-dotted notation */
struct in_addr addr;
- fill_addr4(ip->ip4, &addr);
+ fill_addr4(ip->ip.v4, &addr);
ip_str[0] = 0;
inet_ntop(family, &addr, ip_str, length);
} else if (ip->family == TOX_AF_INET6) {
/* returns hex-groups enclosed into square brackets */
struct in6_addr addr;
- fill_addr6(ip->ip6, &addr);
+ fill_addr6(ip->ip.v6, &addr);
ip_str[0] = '[';
inet_ntop(family, &addr, &ip_str[1], length - 3);
@@ -1072,13 +1077,13 @@ int ip_parse_addr(const IP *ip, char *address, size_t length)
}
if (ip->family == TOX_AF_INET) {
- const struct in_addr *addr = (const struct in_addr *)&ip->ip4;
- return inet_ntop(ip->family, addr, address, length) != NULL;
+ const struct in_addr *addr = (const struct in_addr *)&ip->ip.v4;
+ return inet_ntop(ip->family, addr, address, length) != nullptr;
}
if (ip->family == TOX_AF_INET6) {
- const struct in6_addr *addr = (const struct in6_addr *)&ip->ip6;
- return inet_ntop(ip->family, addr, address, length) != NULL;
+ const struct in6_addr *addr = (const struct in6_addr *)&ip->ip.v6;
+ return inet_ntop(ip->family, addr, address, length) != nullptr;
}
return 0;
@@ -1107,7 +1112,7 @@ int addr_parse_ip(const char *address, IP *to)
if (inet_pton(AF_INET, address, &addr4) == 1) {
to->family = TOX_AF_INET;
- get_ip4(&to->ip4, &addr4);
+ get_ip4(&to->ip.v4, &addr4);
return 1;
}
@@ -1115,7 +1120,7 @@ int addr_parse_ip(const char *address, IP *to)
if (inet_pton(AF_INET6, address, &addr6) == 1) {
to->family = TOX_AF_INET6;
- get_ip6(&to->ip6, &addr6);
+ get_ip6(&to->ip.v6, &addr6);
return 1;
}
@@ -1148,8 +1153,8 @@ int addr_resolve(const char *address, IP *to, IP *extra)
Family tox_family = to->family;
Family family = make_family(tox_family);
- struct addrinfo *server = NULL;
- struct addrinfo *walker = NULL;
+ struct addrinfo *server = nullptr;
+ struct addrinfo *walker = nullptr;
struct addrinfo hints;
int rc;
int result = 0;
@@ -1163,7 +1168,7 @@ int addr_resolve(const char *address, IP *to, IP *extra)
return 0;
}
- rc = getaddrinfo(address, NULL, &hints, &server);
+ rc = getaddrinfo(address, nullptr, &hints, &server);
// Lookup failed.
if (rc != 0) {
@@ -1175,17 +1180,17 @@ int addr_resolve(const char *address, IP *to, IP *extra)
IP ip6;
ip_init(&ip6, 1); // ipv6enabled = 1
- for (walker = server; (walker != NULL) && !done; walker = walker->ai_next) {
+ for (walker = server; (walker != nullptr) && !done; walker = walker->ai_next) {
switch (walker->ai_family) {
case AF_INET:
if (walker->ai_family == family) { /* AF_INET requested, done */
struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
- get_ip4(&to->ip4, &addr->sin_addr);
+ get_ip4(&to->ip.v4, &addr->sin_addr);
result = TOX_ADDR_RESOLVE_INET;
done = 1;
} else if (!(result & TOX_ADDR_RESOLVE_INET)) { /* AF_UNSPEC requested, store away */
struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
- get_ip4(&ip4.ip4, &addr->sin_addr);
+ get_ip4(&ip4.ip.v4, &addr->sin_addr);
result |= TOX_ADDR_RESOLVE_INET;
}
@@ -1195,14 +1200,14 @@ int addr_resolve(const char *address, IP *to, IP *extra)
if (walker->ai_family == family) { /* AF_INET6 requested, done */
if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
- get_ip6(&to->ip6, &addr->sin6_addr);
+ get_ip6(&to->ip.v6, &addr->sin6_addr);
result = TOX_ADDR_RESOLVE_INET6;
done = 1;
}
} else if (!(result & TOX_ADDR_RESOLVE_INET6)) { /* AF_UNSPEC requested, store away */
if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
- get_ip6(&ip6.ip6, &addr->sin6_addr);
+ get_ip6(&ip6.ip.v6, &addr->sin6_addr);
result |= TOX_ADDR_RESOLVE_INET6;
}
}
@@ -1215,7 +1220,7 @@ int addr_resolve(const char *address, IP *to, IP *extra)
if (result & TOX_ADDR_RESOLVE_INET6) {
ip_copy(to, &ip6);
- if ((result & TOX_ADDR_RESOLVE_INET) && (extra != NULL)) {
+ if ((result & TOX_ADDR_RESOLVE_INET) && (extra != nullptr)) {
ip_copy(extra, &ip4);
}
} else if (result & TOX_ADDR_RESOLVE_INET) {
@@ -1265,14 +1270,14 @@ int net_connect(Socket sock, IP_Port ip_port)
addrsize = sizeof(struct sockaddr_in);
addr4->sin_family = AF_INET;
- fill_addr4(ip_port.ip.ip4, &addr4->sin_addr);
+ fill_addr4(ip_port.ip.ip.v4, &addr4->sin_addr);
addr4->sin_port = ip_port.port;
} else if (ip_port.ip.family == TOX_AF_INET6) {
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;
addrsize = sizeof(struct sockaddr_in6);
addr6->sin6_family = AF_INET6;
- fill_addr6(ip_port.ip.ip6, &addr6->sin6_addr);
+ fill_addr6(ip_port.ip.ip.v6, &addr6->sin6_addr);
addr6->sin6_port = ip_port.port;
} else {
return 0;
@@ -1284,8 +1289,8 @@ int net_connect(Socket sock, IP_Port ip_port)
int32_t net_getipport(const char *node, IP_Port **res, int tox_type)
{
struct addrinfo *infos;
- int ret = getaddrinfo(node, NULL, NULL, &infos);
- *res = NULL;
+ int ret = getaddrinfo(node, nullptr, nullptr, &infos);
+ *res = nullptr;
if (ret != 0) {
return -1;
@@ -1295,9 +1300,9 @@ int32_t net_getipport(const char *node, IP_Port **res, int tox_type)
const size_t MAX_COUNT = MIN(SIZE_MAX, INT32_MAX) / sizeof(IP_Port);
int type = make_socktype(tox_type);
struct addrinfo *cur;
- int32_t count = 0;
+ size_t count = 0;
- for (cur = infos; count < MAX_COUNT && cur != NULL; cur = cur->ai_next) {
+ for (cur = infos; count < MAX_COUNT && cur != nullptr; cur = cur->ai_next) {
if (cur->ai_socktype && type > 0 && cur->ai_socktype != type) {
continue;
}
@@ -1318,24 +1323,24 @@ int32_t net_getipport(const char *node, IP_Port **res, int tox_type)
*res = (IP_Port *)malloc(sizeof(IP_Port) * count);
- if (*res == NULL) {
+ if (*res == nullptr) {
freeaddrinfo(infos);
return -1;
}
IP_Port *ip_port = *res;
- for (cur = infos; cur != NULL; cur = cur->ai_next) {
+ for (cur = infos; cur != nullptr; cur = cur->ai_next) {
if (cur->ai_socktype && type > 0 && cur->ai_socktype != type) {
continue;
}
if (cur->ai_family == AF_INET) {
struct sockaddr_in *addr = (struct sockaddr_in *)cur->ai_addr;
- memcpy(&ip_port->ip.ip4, &addr->sin_addr, sizeof(IP4));
+ memcpy(&ip_port->ip.ip.v4, &addr->sin_addr, sizeof(IP4));
} else if (cur->ai_family == AF_INET6) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)cur->ai_addr;
- memcpy(&ip_port->ip.ip6, &addr->sin6_addr, sizeof(IP6));
+ memcpy(&ip_port->ip.ip.v6, &addr->sin6_addr, sizeof(IP6));
} else {
continue;
}
@@ -1471,3 +1476,54 @@ uint16_t net_ntohs(uint16_t hostshort)
{
return ntohs(hostshort);
}
+
+size_t net_pack_u16(uint8_t *bytes, uint16_t v)
+{
+ bytes[0] = (v >> 8) & 0xff;
+ bytes[1] = v & 0xff;
+ return sizeof(v);
+}
+
+size_t net_pack_u32(uint8_t *bytes, uint32_t v)
+{
+ uint8_t *p = bytes;
+ p += net_pack_u16(p, (v >> 16) & 0xffff);
+ p += net_pack_u16(p, v & 0xffff);
+ return p - bytes;
+}
+
+size_t net_pack_u64(uint8_t *bytes, uint64_t v)
+{
+ uint8_t *p = bytes;
+ p += net_pack_u32(p, (v >> 32) & 0xffffffff);
+ p += net_pack_u32(p, v & 0xffffffff);
+ return p - bytes;
+}
+
+size_t net_unpack_u16(const uint8_t *bytes, uint16_t *v)
+{
+ uint8_t hi = bytes[0];
+ uint8_t lo = bytes[1];
+ *v = ((uint16_t)hi << 8) | lo;
+ return sizeof(*v);
+}
+
+size_t net_unpack_u32(const uint8_t *bytes, uint32_t *v)
+{
+ const uint8_t *p = bytes;
+ uint16_t lo, hi;
+ p += net_unpack_u16(p, &hi);
+ p += net_unpack_u16(p, &lo);
+ *v = ((uint32_t)hi << 16) | lo;
+ return p - bytes;
+}
+
+size_t net_unpack_u64(const uint8_t *bytes, uint64_t *v)
+{
+ const uint8_t *p = bytes;
+ uint32_t lo, hi;
+ p += net_unpack_u32(p, &hi);
+ p += net_unpack_u32(p, &lo);
+ *v = ((uint64_t)hi << 32) | lo;
+ return p - bytes;
+}
diff --git a/protocols/Tox/libtox/src/toxcore/network.h b/protocols/Tox/libtox/src/toxcore/network.h
index d3b80218b0..405721b290 100644
--- a/protocols/Tox/libtox/src/toxcore/network.h
+++ b/protocols/Tox/libtox/src/toxcore/network.h
@@ -33,6 +33,7 @@
#include "ccompat.h"
#include "logger.h"
+#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -63,6 +64,10 @@
#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
typedef short Family;
typedef int Socket;
@@ -125,17 +130,16 @@ typedef enum NET_PACKET_TYPE {
#define TCP_INET6 (TOX_AF_INET6 + 3)
#define TCP_FAMILY (TOX_AF_INET6 + 4)
-typedef union {
+typedef union IP4 {
uint32_t uint32;
uint16_t uint16[2];
uint8_t uint8[4];
-}
-IP4;
+} IP4;
IP4 get_ip4_loopback(void);
extern const IP4 IP4_BROADCAST;
-typedef union {
+typedef union IP6 {
uint8_t uint8[16];
uint16_t uint16[8];
uint32_t uint32[4];
@@ -146,12 +150,12 @@ IP6 get_ip6_loopback(void);
extern const IP6 IP6_BROADCAST;
#define IP_DEFINED
-typedef struct {
+typedef struct IP {
uint8_t family;
- GNU_EXTENSION union {
- IP4 ip4;
- IP6 ip6;
- };
+ union {
+ IP4 v4;
+ IP6 v6;
+ } ip;
} IP;
#define IP_PORT_DEFINED
@@ -167,6 +171,14 @@ uint16_t net_htons(uint16_t hostshort);
uint32_t net_ntohl(uint32_t hostlong);
uint16_t net_ntohs(uint16_t hostshort);
+size_t net_pack_u16(uint8_t *bytes, uint16_t v);
+size_t net_pack_u32(uint8_t *bytes, uint32_t v);
+size_t net_pack_u64(uint8_t *bytes, uint64_t v);
+
+size_t net_unpack_u16(const uint8_t *bytes, uint16_t *v);
+size_t net_unpack_u32(const uint8_t *bytes, uint32_t *v);
+size_t net_unpack_u64(const uint8_t *bytes, uint64_t *v);
+
/* Does the IP6 struct a contain an IPv4 address in an IPv6 one? */
#define IPV6_IPV4_IN_V6(a) ((a.uint64[0] == 0) && (a.uint32[2] == net_htonl (0xffff)))
@@ -176,7 +188,7 @@ uint16_t net_ntohs(uint16_t hostshort);
#define SIZE_PORT 2
#define SIZE_IPPORT (SIZE_IP + SIZE_PORT)
-#define TOX_ENABLE_IPV6_DEFAULT 1
+#define TOX_ENABLE_IPV6_DEFAULT true
/* addr_resolve return values */
#define TOX_ADDR_RESOLVE_INET 1
@@ -249,7 +261,7 @@ int ipport_equal(const IP_Port *a, const IP_Port *b);
/* nulls out ip */
void ip_reset(IP *ip);
/* nulls out ip, sets family according to flag */
-void ip_init(IP *ip, uint8_t ipv6enabled);
+void ip_init(IP *ip, bool ipv6enabled);
/* checks if ip is valid */
int ip_isset(const IP *ip);
/* checks if ip is valid */
@@ -409,4 +421,8 @@ Networking_Core *new_networking_no_udp(Logger *log);
/* Function to cleanup networking stuff (doesn't do much right now). */
void kill_networking(Networking_Core *net);
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
#endif
diff --git a/protocols/Tox/libtox/src/toxcore/onion.c b/protocols/Tox/libtox/src/toxcore/onion.c
index fbaf7205d9..48cc4d768c 100644
--- a/protocols/Tox/libtox/src/toxcore/onion.c
+++ b/protocols/Tox/libtox/src/toxcore/onion.c
@@ -55,9 +55,9 @@ static void ip_pack(uint8_t *data, IP source)
if (source.family == TOX_AF_INET || source.family == TOX_TCP_INET) {
memset(data + 1, 0, SIZE_IP6);
- memcpy(data + 1, source.ip4.uint8, SIZE_IP4);
+ memcpy(data + 1, source.ip.v4.uint8, SIZE_IP4);
} else {
- memcpy(data + 1, source.ip6.uint8, SIZE_IP6);
+ memcpy(data + 1, source.ip.v6.uint8, SIZE_IP6);
}
}
@@ -71,9 +71,9 @@ static int ip_unpack(IP *target, const uint8_t *data, unsigned int data_size, bo
target->family = data[0];
if (target->family == TOX_AF_INET || target->family == TOX_TCP_INET) {
- memcpy(target->ip4.uint8, data + 1, SIZE_IP4);
+ memcpy(target->ip.v4.uint8, data + 1, SIZE_IP4);
} else {
- memcpy(target->ip6.uint8, data + 1, SIZE_IP6);
+ memcpy(target->ip.v6.uint8, data + 1, SIZE_IP6);
}
bool valid = disable_family_check ||
@@ -120,8 +120,8 @@ int create_onion_path(const DHT *dht, Onion_Path *new_path, const Node_format *n
return -1;
}
- encrypt_precompute(nodes[0].public_key, dht->self_secret_key, new_path->shared_key1);
- memcpy(new_path->public_key1, dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE);
+ encrypt_precompute(nodes[0].public_key, dht_get_self_secret_key(dht), new_path->shared_key1);
+ memcpy(new_path->public_key1, dht_get_self_public_key(dht), CRYPTO_PUBLIC_KEY_SIZE);
uint8_t random_public_key[CRYPTO_PUBLIC_KEY_SIZE];
uint8_t random_secret_key[CRYPTO_SECRET_KEY_SIZE];
@@ -338,7 +338,7 @@ static int handle_send_initial(void *object, IP_Port source, const uint8_t *pack
uint8_t plain[ONION_MAX_PACKET_SIZE];
uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
- get_shared_key(&onion->shared_keys_1, shared_key, onion->dht->self_secret_key, packet + 1 + CRYPTO_NONCE_SIZE);
+ get_shared_key(&onion->shared_keys_1, shared_key, dht_get_self_secret_key(onion->dht), packet + 1 + CRYPTO_NONCE_SIZE);
int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE,
length - (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE), plain);
@@ -407,7 +407,7 @@ static int handle_send_1(void *object, IP_Port source, const uint8_t *packet, ui
uint8_t plain[ONION_MAX_PACKET_SIZE];
uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
- get_shared_key(&onion->shared_keys_2, shared_key, onion->dht->self_secret_key, packet + 1 + CRYPTO_NONCE_SIZE);
+ get_shared_key(&onion->shared_keys_2, shared_key, dht_get_self_secret_key(onion->dht), packet + 1 + CRYPTO_NONCE_SIZE);
int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE,
length - (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + RETURN_1), plain);
@@ -463,7 +463,7 @@ static int handle_send_2(void *object, IP_Port source, const uint8_t *packet, ui
uint8_t plain[ONION_MAX_PACKET_SIZE];
uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
- get_shared_key(&onion->shared_keys_3, shared_key, onion->dht->self_secret_key, packet + 1 + CRYPTO_NONCE_SIZE);
+ get_shared_key(&onion->shared_keys_3, shared_key, dht_get_self_secret_key(onion->dht), packet + 1 + CRYPTO_NONCE_SIZE);
int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE,
length - (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + RETURN_2), plain);
@@ -635,18 +635,18 @@ void set_callback_handle_recv_1(Onion *onion, int (*function)(void *, IP_Port, c
Onion *new_onion(DHT *dht)
{
- if (dht == NULL) {
- return NULL;
+ if (dht == nullptr) {
+ return nullptr;
}
Onion *onion = (Onion *)calloc(1, sizeof(Onion));
- if (onion == NULL) {
- return NULL;
+ if (onion == nullptr) {
+ return nullptr;
}
onion->dht = dht;
- onion->net = dht->net;
+ onion->net = dht_get_net(dht);
new_symmetric_key(onion->secret_symmetric_key);
onion->timestamp = unix_time();
@@ -663,17 +663,17 @@ Onion *new_onion(DHT *dht)
void kill_onion(Onion *onion)
{
- if (onion == NULL) {
+ if (onion == nullptr) {
return;
}
- networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_INITIAL, NULL, NULL);
- networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_1, NULL, NULL);
- networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_2, NULL, NULL);
+ networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_INITIAL, nullptr, nullptr);
+ networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_1, nullptr, nullptr);
+ networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_2, nullptr, nullptr);
- networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_3, NULL, NULL);
- networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_2, NULL, NULL);
- networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_1, NULL, NULL);
+ networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_3, nullptr, nullptr);
+ networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_2, nullptr, nullptr);
+ networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_1, nullptr, nullptr);
free(onion);
}
diff --git a/protocols/Tox/libtox/src/toxcore/onion_announce.c b/protocols/Tox/libtox/src/toxcore/onion_announce.c
index ab96a546fb..8e49f7bdc7 100644
--- a/protocols/Tox/libtox/src/toxcore/onion_announce.c
+++ b/protocols/Tox/libtox/src/toxcore/onion_announce.c
@@ -87,7 +87,7 @@ int create_announce_request(uint8_t *packet, uint16_t max_packet_length, const u
}
uint8_t plain[ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE +
- ONION_ANNOUNCE_SENDBACK_DATA_LENGTH];
+ ONION_ANNOUNCE_SENDBACK_DATA_LENGTH];
memcpy(plain, ping_id, ONION_PING_ID_SIZE);
memcpy(plain + ONION_PING_ID_SIZE, client_id, CRYPTO_PUBLIC_KEY_SIZE);
memcpy(plain + ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE, data_public_key, CRYPTO_PUBLIC_KEY_SIZE);
@@ -332,10 +332,8 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui
int pos = in_entries(onion_a, public_key);
- unsigned int i;
-
if (pos == -1) {
- for (i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) {
+ for (unsigned i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) {
if (is_timeout(onion_a->entries[i].time, ONION_ANNOUNCE_TIMEOUT)) {
pos = i;
}
@@ -343,7 +341,7 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui
}
if (pos == -1) {
- if (id_closest(onion_a->dht->self_public_key, public_key, onion_a->entries[0].public_key) == 1) {
+ if (id_closest(dht_get_self_public_key(onion_a->dht), public_key, onion_a->entries[0].public_key) == 1) {
pos = 0;
}
}
@@ -358,7 +356,7 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui
memcpy(onion_a->entries[pos].data_public_key, data_public_key, CRYPTO_PUBLIC_KEY_SIZE);
onion_a->entries[pos].time = unix_time();
- sort_onion_announce_list(onion_a->entries, ONION_ANNOUNCE_MAX_ENTRIES, onion_a->dht->self_public_key);
+ sort_onion_announce_list(onion_a->entries, ONION_ANNOUNCE_MAX_ENTRIES, dht_get_self_public_key(onion_a->dht));
return in_entries(onion_a, public_key);
}
@@ -372,10 +370,10 @@ static int handle_announce_request(void *object, IP_Port source, const uint8_t *
const uint8_t *packet_public_key = packet + 1 + CRYPTO_NONCE_SIZE;
uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
- get_shared_key(&onion_a->shared_keys_recv, shared_key, onion_a->dht->self_secret_key, packet_public_key);
+ get_shared_key(&onion_a->shared_keys_recv, shared_key, dht_get_self_secret_key(onion_a->dht), packet_public_key);
uint8_t plain[ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE +
- ONION_ANNOUNCE_SENDBACK_DATA_LENGTH];
+ ONION_ANNOUNCE_SENDBACK_DATA_LENGTH];
int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE,
ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH +
CRYPTO_MAC_SIZE, plain);
@@ -390,7 +388,7 @@ static int handle_announce_request(void *object, IP_Port source, const uint8_t *
uint8_t ping_id2[ONION_PING_ID_SIZE];
generate_ping_id(onion_a, unix_time() + PING_ID_TIMEOUT, packet_public_key, source, ping_id2);
- int index = -1;
+ int index;
uint8_t *data_public_key = plain + ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE;
@@ -493,18 +491,18 @@ static int handle_data_request(void *object, IP_Port source, const uint8_t *pack
Onion_Announce *new_onion_announce(DHT *dht)
{
- if (dht == NULL) {
- return NULL;
+ if (dht == nullptr) {
+ return nullptr;
}
Onion_Announce *onion_a = (Onion_Announce *)calloc(1, sizeof(Onion_Announce));
- if (onion_a == NULL) {
- return NULL;
+ if (onion_a == nullptr) {
+ return nullptr;
}
onion_a->dht = dht;
- onion_a->net = dht->net;
+ onion_a->net = dht_get_net(dht);
new_symmetric_key(onion_a->secret_bytes);
networking_registerhandler(onion_a->net, NET_PACKET_ANNOUNCE_REQUEST, &handle_announce_request, onion_a);
@@ -515,11 +513,11 @@ Onion_Announce *new_onion_announce(DHT *dht)
void kill_onion_announce(Onion_Announce *onion_a)
{
- if (onion_a == NULL) {
+ if (onion_a == nullptr) {
return;
}
- networking_registerhandler(onion_a->net, NET_PACKET_ANNOUNCE_REQUEST, NULL, NULL);
- networking_registerhandler(onion_a->net, NET_PACKET_ONION_DATA_REQUEST, NULL, NULL);
+ networking_registerhandler(onion_a->net, NET_PACKET_ANNOUNCE_REQUEST, nullptr, nullptr);
+ networking_registerhandler(onion_a->net, NET_PACKET_ONION_DATA_REQUEST, nullptr, nullptr);
free(onion_a);
}
diff --git a/protocols/Tox/libtox/src/toxcore/onion_client.c b/protocols/Tox/libtox/src/toxcore/onion_client.c
index f7ff41bd7a..c4eb3fc175 100644
--- a/protocols/Tox/libtox/src/toxcore/onion_client.c
+++ b/protocols/Tox/libtox/src/toxcore/onion_client.c
@@ -280,7 +280,7 @@ static uint16_t random_nodes_path_onion(const Onion_Client *onion_c, Node_format
if (num_nodes >= 2) {
nodes[0].ip_port.ip.family = TCP_FAMILY;
- nodes[0].ip_port.ip.ip4.uint32 = random_tcp;
+ nodes[0].ip_port.ip.ip.v4.uint32 = random_tcp;
for (i = 1; i < max_num; ++i) {
nodes[i] = onion_c->path_nodes[rand() % num_nodes];
@@ -294,7 +294,7 @@ static uint16_t random_nodes_path_onion(const Onion_Client *onion_c, Node_format
}
nodes[0].ip_port.ip.family = TCP_FAMILY;
- nodes[0].ip_port.ip.ip4.uint32 = random_tcp;
+ nodes[0].ip_port.ip.ip.v4.uint32 = random_tcp;
for (i = 1; i < max_num; ++i) {
nodes[i] = onion_c->path_nodes_bs[rand() % num_nodes_bs];
@@ -485,7 +485,7 @@ static int send_onion_packet_tcp_udp(const Onion_Client *onion_c, const Onion_Pa
return -1;
}
- return send_tcp_onion_request(onion_c->c, path->ip_port1.ip.ip4.uint32, packet, len);
+ return send_tcp_onion_request(onion_c->c, path->ip_port1.ip.ip.v4.uint32, packet, len);
}
return -1;
@@ -579,7 +579,7 @@ static int client_send_announce_request(Onion_Client *onion_c, uint32_t num, IP_
uint8_t zero_ping_id[ONION_PING_ID_SIZE] = {0};
- if (ping_id == NULL) {
+ if (ping_id == nullptr) {
ping_id = zero_ping_id;
}
@@ -670,8 +670,8 @@ static int client_add_to_list(Onion_Client *onion_c, uint32_t num, const uint8_t
return -1;
}
- Onion_Node *list_nodes = NULL;
- const uint8_t *reference_id = NULL;
+ Onion_Node *list_nodes = nullptr;
+ const uint8_t *reference_id = nullptr;
unsigned int list_length;
if (num == 0) {
@@ -772,12 +772,12 @@ static int client_ping_nodes(Onion_Client *onion_c, uint32_t num, const Node_for
return 0;
}
- Onion_Node *list_nodes = NULL;
- const uint8_t *reference_id = NULL;
+ Onion_Node *list_nodes = nullptr;
+ const uint8_t *reference_id = nullptr;
unsigned int list_length;
- Last_Pinged *last_pinged = NULL;
- uint8_t *last_pinged_index = NULL;
+ Last_Pinged *last_pinged = nullptr;
+ uint8_t *last_pinged_index = nullptr;
if (num == 0) {
list_nodes = onion_c->clients_announce_list;
@@ -816,7 +816,7 @@ static int client_ping_nodes(Onion_Client *onion_c, uint32_t num, const Node_for
}
if (j == list_length && good_to_ping(last_pinged, last_pinged_index, nodes[i].public_key)) {
- client_send_announce_request(onion_c, num, nodes[i].ip_port, nodes[i].public_key, NULL, ~0);
+ client_send_announce_request(onion_c, num, nodes[i].ip_port, nodes[i].public_key, nullptr, ~0);
}
}
}
@@ -845,7 +845,7 @@ static int handle_announce_response(void *object, IP_Port source, const uint8_t
}
VLA(uint8_t, plain, 1 + ONION_PING_ID_SIZE + len_nodes);
- int len = -1;
+ int len;
if (num == 0) {
len = decrypt_data(public_key, nc_get_self_secret_key(onion_c->c),
@@ -875,7 +875,7 @@ static int handle_announce_response(void *object, IP_Port source, const uint8_t
if (len_nodes != 0) {
Node_format nodes[MAX_SENT_NODES];
- int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, 0, plain + 1 + ONION_PING_ID_SIZE, len_nodes, 0);
+ int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, nullptr, plain + 1 + ONION_PING_ID_SIZE, len_nodes, 0);
if (num_nodes <= 0) {
return 1;
@@ -974,7 +974,7 @@ static int handle_dhtpk_announce(void *object, const uint8_t *source_pubkey, con
if (len_nodes != 0) {
Node_format nodes[MAX_SENT_NODES];
- int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, 0, data + 1 + sizeof(uint64_t) + CRYPTO_PUBLIC_KEY_SIZE,
+ int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, nullptr, data + 1 + sizeof(uint64_t) + CRYPTO_PUBLIC_KEY_SIZE,
len_nodes, 1);
if (num_nodes <= 0) {
@@ -1133,7 +1133,7 @@ static int send_dht_dhtpk(const Onion_Client *onion_c, int friend_num, const uin
}
uint8_t packet[MAX_CRYPTO_REQUEST_SIZE];
- len = create_request(onion_c->dht->self_public_key, onion_c->dht->self_secret_key, packet,
+ len = create_request(dht_get_self_public_key(onion_c->dht), dht_get_self_secret_key(onion_c->dht), packet,
onion_c->friends_list[friend_num].dht_public_key, temp, SIZEOF_VLA(temp), CRYPTO_PACKET_DHTPK);
if (len == -1) {
@@ -1192,7 +1192,7 @@ static int send_dhtpk_announce(Onion_Client *onion_c, uint16_t friend_num, uint8
uint64_t no_replay = unix_time();
host_to_net((uint8_t *)&no_replay, sizeof(no_replay));
memcpy(data + 1, &no_replay, sizeof(no_replay));
- memcpy(data + 1 + sizeof(uint64_t), onion_c->dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE);
+ memcpy(data + 1 + sizeof(uint64_t), dht_get_self_public_key(onion_c->dht), CRYPTO_PUBLIC_KEY_SIZE);
Node_format nodes[MAX_SENT_NODES];
uint16_t num_relays = copy_connected_tcp_relays(onion_c->c, nodes, (MAX_SENT_NODES / 2));
uint16_t num_nodes = closelist_nodes(onion_c->dht, &nodes[num_relays], MAX_SENT_NODES - num_relays);
@@ -1260,13 +1260,13 @@ static int realloc_onion_friends(Onion_Client *onion_c, uint32_t num)
{
if (num == 0) {
free(onion_c->friends_list);
- onion_c->friends_list = NULL;
+ onion_c->friends_list = nullptr;
return 0;
}
Onion_Friend *newonion_friends = (Onion_Friend *)realloc(onion_c->friends_list, num * sizeof(Onion_Friend));
- if (newonion_friends == NULL) {
+ if (newonion_friends == nullptr) {
return -1;
}
@@ -1351,14 +1351,14 @@ int onion_delfriend(Onion_Client *onion_c, int friend_num)
* return -1 on failure.
* return 0 on success.
*/
-int recv_tcp_relay_handler(Onion_Client *onion_c, int friend_num, int (*tcp_relay_node_callback)(void *object,
+int recv_tcp_relay_handler(Onion_Client *onion_c, int friend_num, int (*callback)(void *object,
uint32_t number, IP_Port ip_port, const uint8_t *public_key), void *object, uint32_t number)
{
if ((uint32_t)friend_num >= onion_c->num_friends) {
return -1;
}
- onion_c->friends_list[friend_num].tcp_relay_node_callback = tcp_relay_node_callback;
+ onion_c->friends_list[friend_num].tcp_relay_node_callback = callback;
onion_c->friends_list[friend_num].tcp_relay_node_callback_object = object;
onion_c->friends_list[friend_num].tcp_relay_node_callback_number = number;
return 0;
@@ -1551,15 +1551,15 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
}
}
- unsigned int i, count = 0;
- Onion_Node *list_nodes = onion_c->friends_list[friendnum].clients_list;
-
if (!onion_c->friends_list[friendnum].is_online) {
+ unsigned int count = 0;
+ Onion_Node *list_nodes = onion_c->friends_list[friendnum].clients_list;
+
// ensure we get a response from some node roughly once per
// (interval / MAX_ONION_CLIENTS)
bool ping_random = true;
- for (i = 0; i < MAX_ONION_CLIENTS; ++i) {
+ for (unsigned i = 0; i < MAX_ONION_CLIENTS; ++i) {
if (!(is_timeout(list_nodes[i].timestamp, interval / MAX_ONION_CLIENTS)
&& is_timeout(list_nodes[i].last_pinged, ONION_NODE_PING_INTERVAL))) {
ping_random = false;
@@ -1567,7 +1567,7 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
}
}
- for (i = 0; i < MAX_ONION_CLIENTS; ++i) {
+ for (unsigned i = 0; i < MAX_ONION_CLIENTS; ++i) {
if (onion_node_timed_out(&list_nodes[i])) {
continue;
}
@@ -1586,7 +1586,8 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
if (is_timeout(list_nodes[i].last_pinged, interval)
|| (ping_random && rand() % (MAX_ONION_CLIENTS - i) == 0)) {
- if (client_send_announce_request(onion_c, friendnum + 1, list_nodes[i].ip_port, list_nodes[i].public_key, 0, ~0) == 0) {
+ if (client_send_announce_request(onion_c, friendnum + 1, list_nodes[i].ip_port,
+ list_nodes[i].public_key, nullptr, ~0) == 0) {
list_nodes[i].last_pinged = unix_time();
++list_nodes[i].unsuccessful_pings;
ping_random = false;
@@ -1610,7 +1611,7 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
for (j = 0; j < n; ++j) {
unsigned int num = rand() % num_nodes;
client_send_announce_request(onion_c, friendnum + 1, onion_c->path_nodes[num].ip_port,
- onion_c->path_nodes[num].public_key, 0, ~0);
+ onion_c->path_nodes[num].public_key, nullptr, ~0);
}
++onion_c->friends_list[friendnum].run_count;
@@ -1729,7 +1730,7 @@ static void do_announce(Onion_Client *onion_c)
if (num_nodes != 0) {
for (i = 0; i < (MAX_ONION_CLIENTS_ANNOUNCE / 2); ++i) {
unsigned int num = rand() % num_nodes;
- client_send_announce_request(onion_c, 0, path_nodes[num].ip_port, path_nodes[num].public_key, 0, ~0);
+ client_send_announce_request(onion_c, 0, path_nodes[num].ip_port, path_nodes[num].public_key, nullptr, ~0);
}
}
}
@@ -1799,8 +1800,6 @@ unsigned int onion_connection_status(const Onion_Client *onion_c)
void do_onion_client(Onion_Client *onion_c)
{
- unsigned int i;
-
if (onion_c->last_run == unix_time()) {
return;
}
@@ -1832,7 +1831,7 @@ void do_onion_client(Onion_Client *onion_c)
|| get_random_tcp_onion_conn_number(nc_get_tcp_c(onion_c->c)) == -1; /* Check if connected to any TCP relays. */
if (onion_connection_status(onion_c)) {
- for (i = 0; i < onion_c->num_friends; ++i) {
+ for (unsigned i = 0; i < onion_c->num_friends; ++i) {
do_friend(onion_c, i);
}
}
@@ -1846,25 +1845,25 @@ void do_onion_client(Onion_Client *onion_c)
Onion_Client *new_onion_client(Net_Crypto *c)
{
- if (c == NULL) {
- return NULL;
+ if (c == nullptr) {
+ return nullptr;
}
Onion_Client *onion_c = (Onion_Client *)calloc(1, sizeof(Onion_Client));
- if (onion_c == NULL) {
- return NULL;
+ if (onion_c == nullptr) {
+ return nullptr;
}
onion_c->announce_ping_array = ping_array_new(ANNOUNCE_ARRAY_SIZE, ANNOUNCE_TIMEOUT);
- if (onion_c->announce_ping_array == NULL) {
+ if (onion_c->announce_ping_array == nullptr) {
free(onion_c);
- return NULL;
+ return nullptr;
}
onion_c->dht = nc_get_dht(c);
- onion_c->net = onion_c->dht->net;
+ onion_c->net = dht_get_net(onion_c->dht);
onion_c->c = c;
new_symmetric_key(onion_c->secret_symmetric_key);
crypto_new_keypair(onion_c->temp_public_key, onion_c->temp_secret_key);
@@ -1879,17 +1878,17 @@ Onion_Client *new_onion_client(Net_Crypto *c)
void kill_onion_client(Onion_Client *onion_c)
{
- if (onion_c == NULL) {
+ if (onion_c == nullptr) {
return;
}
ping_array_kill(onion_c->announce_ping_array);
realloc_onion_friends(onion_c, 0);
- networking_registerhandler(onion_c->net, NET_PACKET_ANNOUNCE_RESPONSE, NULL, NULL);
- networking_registerhandler(onion_c->net, NET_PACKET_ONION_DATA_RESPONSE, NULL, NULL);
- oniondata_registerhandler(onion_c, ONION_DATA_DHTPK, NULL, NULL);
- cryptopacket_registerhandler(onion_c->dht, CRYPTO_PACKET_DHTPK, NULL, NULL);
- set_onion_packet_tcp_connection_callback(nc_get_tcp_c(onion_c->c), NULL, NULL);
+ networking_registerhandler(onion_c->net, NET_PACKET_ANNOUNCE_RESPONSE, nullptr, nullptr);
+ networking_registerhandler(onion_c->net, NET_PACKET_ONION_DATA_RESPONSE, nullptr, nullptr);
+ oniondata_registerhandler(onion_c, ONION_DATA_DHTPK, nullptr, nullptr);
+ cryptopacket_registerhandler(onion_c->dht, CRYPTO_PACKET_DHTPK, nullptr, nullptr);
+ set_onion_packet_tcp_connection_callback(nc_get_tcp_c(onion_c->c), nullptr, nullptr);
crypto_memzero(onion_c, sizeof(Onion_Client));
free(onion_c);
}
diff --git a/protocols/Tox/libtox/src/toxcore/ping.c b/protocols/Tox/libtox/src/toxcore/ping.c
index f2f560136f..bede07a117 100644
--- a/protocols/Tox/libtox/src/toxcore/ping.c
+++ b/protocols/Tox/libtox/src/toxcore/ping.c
@@ -64,7 +64,7 @@ int32_t ping_send_request(Ping *ping, IP_Port ipp, const uint8_t *public_key)
int rc;
uint64_t ping_id;
- if (id_equal(public_key, ping->dht->self_public_key)) {
+ if (id_equal(public_key, dht_get_self_public_key(ping->dht))) {
return 1;
}
@@ -87,7 +87,7 @@ int32_t ping_send_request(Ping *ping, IP_Port ipp, const uint8_t *public_key)
memcpy(ping_plain + 1, &ping_id, sizeof(ping_id));
pk[0] = NET_PACKET_PING_REQUEST;
- id_copy(pk + 1, ping->dht->self_public_key); // Our pubkey
+ id_copy(pk + 1, dht_get_self_public_key(ping->dht)); // Our pubkey
random_nonce(pk + 1 + CRYPTO_PUBLIC_KEY_SIZE); // Generate new nonce
@@ -100,7 +100,7 @@ int32_t ping_send_request(Ping *ping, IP_Port ipp, const uint8_t *public_key)
return 1;
}
- return sendpacket(ping->dht->net, ipp, pk, sizeof(pk));
+ return sendpacket(dht_get_net(ping->dht), ipp, pk, sizeof(pk));
}
static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key, uint64_t ping_id,
@@ -109,7 +109,7 @@ static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key
uint8_t pk[DHT_PING_SIZE];
int rc;
- if (id_equal(public_key, ping->dht->self_public_key)) {
+ if (id_equal(public_key, dht_get_self_public_key(ping->dht))) {
return 1;
}
@@ -118,7 +118,7 @@ static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key
memcpy(ping_plain + 1, &ping_id, sizeof(ping_id));
pk[0] = NET_PACKET_PING_RESPONSE;
- id_copy(pk + 1, ping->dht->self_public_key); // Our pubkey
+ id_copy(pk + 1, dht_get_self_public_key(ping->dht)); // Our pubkey
random_nonce(pk + 1 + CRYPTO_PUBLIC_KEY_SIZE); // Generate new nonce
// Encrypt ping_id using recipient privkey
@@ -131,7 +131,7 @@ static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key
return 1;
}
- return sendpacket(ping->dht->net, ipp, pk, sizeof(pk));
+ return sendpacket(dht_get_net(ping->dht), ipp, pk, sizeof(pk));
}
static int handle_ping_request(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata)
@@ -143,9 +143,9 @@ static int handle_ping_request(void *object, IP_Port source, const uint8_t *pack
return 1;
}
- Ping *ping = dht->ping;
+ Ping *ping = dht_get_ping(dht);
- if (id_equal(packet + 1, ping->dht->self_public_key)) {
+ if (id_equal(packet + 1, dht_get_self_public_key(ping->dht))) {
return 1;
}
@@ -186,9 +186,9 @@ static int handle_ping_response(void *object, IP_Port source, const uint8_t *pac
return 1;
}
- Ping *ping = dht->ping;
+ Ping *ping = dht_get_ping(dht);
- if (id_equal(packet + 1, ping->dht->self_public_key)) {
+ if (id_equal(packet + 1, dht_get_self_public_key(ping->dht))) {
return 1;
}
@@ -284,7 +284,7 @@ int32_t ping_add(Ping *ping, const uint8_t *public_key, IP_Port ip_port)
return -1;
}
- if (in_list(ping->dht->close_clientlist, LCLIENT_LIST, public_key, ip_port)) {
+ if (in_list(dht_get_close_clientlist(ping->dht), LCLIENT_LIST, public_key, ip_port)) {
return -1;
}
@@ -309,7 +309,7 @@ int32_t ping_add(Ping *ping, const uint8_t *public_key, IP_Port ip_port)
}
}
- if (add_to_list(ping->to_ping, MAX_TO_PING, public_key, ip_port, ping->dht->self_public_key)) {
+ if (add_to_list(ping->to_ping, MAX_TO_PING, public_key, ip_port, dht_get_self_public_key(ping->dht))) {
return 0;
}
@@ -355,28 +355,28 @@ Ping *ping_new(DHT *dht)
{
Ping *ping = (Ping *)calloc(1, sizeof(Ping));
- if (ping == NULL) {
- return NULL;
+ if (ping == nullptr) {
+ return nullptr;
}
ping->ping_array = ping_array_new(PING_NUM_MAX, PING_TIMEOUT);
- if (ping->ping_array == NULL) {
+ if (ping->ping_array == nullptr) {
free(ping);
- return NULL;
+ return nullptr;
}
ping->dht = dht;
- networking_registerhandler(ping->dht->net, NET_PACKET_PING_REQUEST, &handle_ping_request, dht);
- networking_registerhandler(ping->dht->net, NET_PACKET_PING_RESPONSE, &handle_ping_response, dht);
+ networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_REQUEST, &handle_ping_request, dht);
+ networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_RESPONSE, &handle_ping_response, dht);
return ping;
}
void ping_kill(Ping *ping)
{
- networking_registerhandler(ping->dht->net, NET_PACKET_PING_REQUEST, NULL, NULL);
- networking_registerhandler(ping->dht->net, NET_PACKET_PING_RESPONSE, NULL, NULL);
+ networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_REQUEST, nullptr, nullptr);
+ networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_RESPONSE, nullptr, nullptr);
ping_array_kill(ping->ping_array);
free(ping);
diff --git a/protocols/Tox/libtox/src/toxcore/ping_array.c b/protocols/Tox/libtox/src/toxcore/ping_array.c
index 627f8d5a64..a54ebfe209 100644
--- a/protocols/Tox/libtox/src/toxcore/ping_array.c
+++ b/protocols/Tox/libtox/src/toxcore/ping_array.c
@@ -57,20 +57,20 @@ struct Ping_Array {
Ping_Array *ping_array_new(uint32_t size, uint32_t timeout)
{
if (size == 0 || timeout == 0) {
- return NULL;
+ return nullptr;
}
Ping_Array *empty_array = (Ping_Array *)calloc(1, sizeof(Ping_Array));
- if (empty_array == NULL) {
- return NULL;
+ if (empty_array == nullptr) {
+ return nullptr;
}
empty_array->entries = (Ping_Array_Entry *)calloc(size, sizeof(Ping_Array_Entry));
- if (empty_array->entries == NULL) {
+ if (empty_array->entries == nullptr) {
free(empty_array);
- return NULL;
+ return nullptr;
}
empty_array->last_deleted = empty_array->last_added = 0;
@@ -82,7 +82,7 @@ Ping_Array *ping_array_new(uint32_t size, uint32_t timeout)
static void clear_entry(Ping_Array *array, uint32_t index)
{
free(array->entries[index].data);
- array->entries[index].data = NULL;
+ array->entries[index].data = nullptr;
array->entries[index].length =
array->entries[index].time =
array->entries[index].ping_id = 0;
@@ -128,14 +128,14 @@ uint64_t ping_array_add(Ping_Array *array, const uint8_t *data, uint32_t length)
ping_array_clear_timedout(array);
uint32_t index = array->last_added % array->total_size;
- if (array->entries[index].data != NULL) {
+ if (array->entries[index].data != nullptr) {
array->last_deleted = array->last_added - array->total_size;
clear_entry(array, index);
}
array->entries[index].data = malloc(length);
- if (array->entries[index].data == NULL) {
+ if (array->entries[index].data == nullptr) {
return 0;
}
@@ -184,7 +184,7 @@ int32_t ping_array_check(Ping_Array *array, uint8_t *data, size_t length, uint64
return -1;
}
- if (array->entries[index].data == NULL) {
+ if (array->entries[index].data == nullptr) {
return -1;
}
diff --git a/protocols/Tox/libtox/src/toxcore/tox.api.h b/protocols/Tox/libtox/src/toxcore/tox.api.h
index 7f3d8d4cff..59af69b9c3 100644
--- a/protocols/Tox/libtox/src/toxcore/tox.api.h
+++ b/protocols/Tox/libtox/src/toxcore/tox.api.h
@@ -188,19 +188,19 @@ const VERSION_PATCH = 0;
* features, but can't break the API.
*/
#define TOX_VERSION_IS_API_COMPATIBLE(MAJOR, MINOR, PATCH) \
- (TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \
+ ((TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \
/* 1.x.x, 2.x.x, etc. with matching major version. */ \
TOX_VERSION_MINOR > MINOR || \
- TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH \
- ) || (TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \
+ (TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH) \
+ )) || ((TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \
/* 0.x.x makes minor behave like major above. */ \
- (TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \
+ ((TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \
TOX_VERSION_PATCH >= PATCH \
- ) || (TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \
+ )) || ((TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \
/* 0.0.x and 0.0.y are only compatible if x == y. */ \
TOX_VERSION_PATCH == PATCH \
- ) \
- )
+ )) \
+ ))
static namespace version {
@@ -257,26 +257,36 @@ const ADDRESS_SIZE = PUBLIC_KEY_SIZE + NOSPAM_SIZE + sizeof(uint1
/**
* Maximum length of a nickname in bytes.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
const MAX_NAME_LENGTH = 128;
/**
* Maximum length of a status message in bytes.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
const MAX_STATUS_MESSAGE_LENGTH = 1007;
/**
* Maximum length of a friend request message in bytes.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
const MAX_FRIEND_REQUEST_LENGTH = 1016;
/**
* Maximum length of a single message after which it should be split.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
const MAX_MESSAGE_LENGTH = 1372;
/**
* Maximum size of custom packets. TODO(iphydf): should be LENGTH?
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
const MAX_CUSTOM_PACKET_SIZE = 1373;
@@ -292,6 +302,8 @@ const FILE_ID_LENGTH = 32;
/**
* Maximum file name length for file transfers.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
const MAX_FILENAME_LENGTH = 255;
@@ -338,11 +350,6 @@ enum class MESSAGE_TYPE {
* on IRC.
*/
ACTION,
- /**
- * Correction of the last message. With empty message body can be used to mark
- * last message as deleted.
- */
- CORRECTION,
}
@@ -448,7 +455,7 @@ static class options {
* @deprecated The memory layout of this struct (size, alignment, and field
* order) is not part of the ABI. To remain compatible, prefer to use $new to
* allocate the object and accessor functions to set the members. The struct
- * will become opaque (i.e. the definition will become private) in v0.2.0.
+ * will become opaque (i.e. the definition will become private) in v0.3.0.
*/
struct this [get, set] {
/**
@@ -806,6 +813,9 @@ inline namespace self {
/**
* Return whether we are connected to the DHT. The return value is equal to the
* last value received through the `${event connection_status}` callback.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
get();
}
@@ -1222,11 +1232,11 @@ namespace friend {
uint64_t last_online {
/**
- * Return a unix-time timestamp of the last time the friend associated with a given
- * friend number was seen online. This function will return UINT64_MAX on error.
- *
- * @param friend_number The friend number you want to query.
- */
+ * Return a unix-time timestamp of the last time the friend associated with a given
+ * friend number was seen online. This function will return UINT64_MAX on error.
+ *
+ * @param friend_number The friend number you want to query.
+ */
get(uint32_t friend_number) {
/**
* No friend with the given number exists on the friend list.
@@ -1356,6 +1366,9 @@ namespace friend {
*
* The status returned is equal to the last status received through the
* `${event status}` callback.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
get(uint32_t friend_number)
with error for query;
@@ -1387,6 +1400,9 @@ namespace friend {
*
* @return the friend's connection status as it was received through the
* `${event connection_status}` event.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
get(uint32_t friend_number)
with error for query;
@@ -1420,6 +1436,9 @@ namespace friend {
* @return true if the friend is typing.
* @return false if the friend is not typing, or the friend number was
* invalid. Inspect the error code to determine which case it is.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
get(uint32_t friend_number)
with error for query;
@@ -2110,34 +2129,33 @@ namespace conference {
typedef void(uint32_t conference_number, uint32_t peer_number, const uint8_t[length] title);
}
- /**
- * Peer list state change types.
- */
- enum class STATE_CHANGE {
- /**
- * A peer has joined the conference.
- */
- PEER_JOIN,
- /**
- * A peer has exited the conference.
- */
- PEER_EXIT,
+ namespace peer {
+
/**
- * A peer has changed their name.
+ * This event is triggered when a peer changes their name.
*/
- PEER_NAME_CHANGE,
- }
+ event name const {
+ /**
+ * @param conference_number The conference number of the conference the
+ * peer is in.
+ * @param peer_number The ID of the peer who changed their nickname.
+ * @param name A byte array containing the new nickname.
+ * @param length The size of the name byte array.
+ */
+ typedef void(uint32_t conference_number, uint32_t peer_number, const uint8_t[length] name);
+ }
- /**
- * This event is triggered when the peer list changes (name change, peer join, peer exit).
- */
- event namelist_change const {
/**
- * @param conference_number The conference number of the conference the title change is intended for.
- * @param peer_number The ID of the peer who changed the title.
- * @param change The type of change (one of $STATE_CHANGE).
+ * This event is triggered when a peer joins or leaves the conference.
*/
- typedef void(uint32_t conference_number, uint32_t peer_number, STATE_CHANGE change);
+ event list_changed const {
+ /**
+ * @param conference_number The conference number of the conference the
+ * peer is in.
+ */
+ typedef void(uint32_t conference_number);
+ }
+
}
diff --git a/protocols/Tox/libtox/src/toxcore/tox.c b/protocols/Tox/libtox/src/toxcore/tox.c
index 2fd478dc8c..3db2bd35f3 100644
--- a/protocols/Tox/libtox/src/toxcore/tox.c
+++ b/protocols/Tox/libtox/src/toxcore/tox.c
@@ -82,37 +82,37 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error)
{
Messenger_Options m_options = {0};
- bool load_savedata_sk = 0, load_savedata_tox = 0;
+ bool load_savedata_sk = false, load_savedata_tox = false;
- if (options == NULL) {
+ if (options == nullptr) {
m_options.ipv6enabled = TOX_ENABLE_IPV6_DEFAULT;
} else {
if (tox_options_get_savedata_type(options) != TOX_SAVEDATA_TYPE_NONE) {
- if (tox_options_get_savedata_data(options) == NULL || tox_options_get_savedata_length(options) == 0) {
+ if (tox_options_get_savedata_data(options) == nullptr || tox_options_get_savedata_length(options) == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
- return NULL;
+ return nullptr;
}
}
if (tox_options_get_savedata_type(options) == TOX_SAVEDATA_TYPE_SECRET_KEY) {
if (tox_options_get_savedata_length(options) != TOX_SECRET_KEY_SIZE) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
- return NULL;
+ return nullptr;
}
- load_savedata_sk = 1;
+ load_savedata_sk = true;
} else if (tox_options_get_savedata_type(options) == TOX_SAVEDATA_TYPE_TOX_SAVE) {
if (tox_options_get_savedata_length(options) < TOX_ENC_SAVE_MAGIC_LENGTH) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
- return NULL;
+ return nullptr;
}
if (crypto_memcmp(tox_options_get_savedata_data(options), TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_ENCRYPTED);
- return NULL;
+ return nullptr;
}
- load_savedata_tox = 1;
+ load_savedata_tox = true;
}
m_options.ipv6enabled = tox_options_get_ipv6_enabled(options);
@@ -141,13 +141,13 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error)
default:
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_TYPE);
- return NULL;
+ return nullptr;
}
if (m_options.proxy_info.proxy_type != TCP_PROXY_NONE) {
if (tox_options_get_proxy_port(options) == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_PORT);
- return NULL;
+ return nullptr;
}
ip_init(&m_options.proxy_info.ip_port.ip, m_options.ipv6enabled);
@@ -156,10 +156,10 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error)
m_options.proxy_info.ip_port.ip.family = TOX_AF_UNSPEC;
}
- if (!addr_resolve_or_parse_ip(tox_options_get_proxy_host(options), &m_options.proxy_info.ip_port.ip, NULL)) {
+ if (addr_resolve_or_parse_ip(tox_options_get_proxy_host(options), &m_options.proxy_info.ip_port.ip, nullptr) == 0) {
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_HOST);
// TODO(irungentoo): TOX_ERR_NEW_PROXY_NOT_FOUND if domain.
- return NULL;
+ return nullptr;
}
m_options.proxy_info.ip_port.port = net_htons(tox_options_get_proxy_port(options));
@@ -180,7 +180,7 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error)
SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
}
- return NULL;
+ return nullptr;
}
if (load_savedata_tox
@@ -198,7 +198,7 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error)
void tox_kill(Tox *tox)
{
- if (tox == NULL) {
+ if (tox == nullptr) {
return;
}
@@ -457,7 +457,8 @@ void tox_self_set_status(Tox *tox, TOX_USER_STATUS status)
TOX_USER_STATUS tox_self_get_status(const Tox *tox)
{
const Messenger *m = tox;
- return (TOX_USER_STATUS)m_get_self_userstatus(m);
+ const uint8_t status = m_get_self_userstatus(m);
+ return (TOX_USER_STATUS)status;
}
static void set_friend_error(int32_t ret, TOX_ERR_FRIEND_ADD *error)
@@ -1103,11 +1104,16 @@ void tox_callback_conference_title(Tox *tox, tox_conference_title_cb *callback)
g_callback_group_title((Group_Chats *)m->conferences_object, callback);
}
-void tox_callback_conference_namelist_change(Tox *tox, tox_conference_namelist_change_cb *callback)
+void tox_callback_conference_peer_name(Tox *tox, tox_conference_peer_name_cb *callback)
{
Messenger *m = tox;
- g_callback_group_namelistchange((Group_Chats *)m->conferences_object, (void (*)(struct Messenger *, int, int, uint8_t,
- void *))callback);
+ g_callback_peer_name((Group_Chats *)m->conferences_object, callback);
+}
+
+void tox_callback_conference_peer_list_changed(Tox *tox, tox_conference_peer_list_changed_cb *callback)
+{
+ Messenger *m = tox;
+ g_callback_peer_list_changed((Group_Chats *)m->conferences_object, callback);
}
uint32_t tox_conference_new(Tox *tox, TOX_ERR_CONFERENCE_NEW *error)
@@ -1519,7 +1525,7 @@ void tox_self_get_dht_id(const Tox *tox, uint8_t *dht_id)
{
if (dht_id) {
const Messenger *m = tox;
- memcpy(dht_id, m->dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE);
+ memcpy(dht_id, dht_get_self_public_key(m->dht), CRYPTO_PUBLIC_KEY_SIZE);
}
}
diff --git a/protocols/Tox/libtox/src/toxcore/tox.h b/protocols/Tox/libtox/src/toxcore/tox.h
index f4f3d06639..41a0994ed6 100644
--- a/protocols/Tox/libtox/src/toxcore/tox.h
+++ b/protocols/Tox/libtox/src/toxcore/tox.h
@@ -191,19 +191,19 @@ uint32_t tox_version_patch(void);
* features, but can't break the API.
*/
#define TOX_VERSION_IS_API_COMPATIBLE(MAJOR, MINOR, PATCH) \
- (TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \
+ ((TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \
/* 1.x.x, 2.x.x, etc. with matching major version. */ \
TOX_VERSION_MINOR > MINOR || \
- TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH \
- ) || (TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \
+ (TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH) \
+ )) || ((TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \
/* 0.x.x makes minor behave like major above. */ \
- (TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \
+ ((TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \
TOX_VERSION_PATCH >= PATCH \
- ) || (TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \
+ )) || ((TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \
/* 0.0.x and 0.0.y are only compatible if x == y. */ \
TOX_VERSION_PATCH == PATCH \
- ) \
- )
+ )) \
+ ))
/**
* Return whether the compiled library version is compatible with the passed
@@ -266,6 +266,8 @@ uint32_t tox_address_size(void);
/**
* Maximum length of a nickname in bytes.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
#define TOX_MAX_NAME_LENGTH 128
@@ -273,6 +275,8 @@ uint32_t tox_max_name_length(void);
/**
* Maximum length of a status message in bytes.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
#define TOX_MAX_STATUS_MESSAGE_LENGTH 1007
@@ -280,6 +284,8 @@ uint32_t tox_max_status_message_length(void);
/**
* Maximum length of a friend request message in bytes.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
#define TOX_MAX_FRIEND_REQUEST_LENGTH 1016
@@ -287,6 +293,8 @@ uint32_t tox_max_friend_request_length(void);
/**
* Maximum length of a single message after which it should be split.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
#define TOX_MAX_MESSAGE_LENGTH 1372
@@ -294,6 +302,8 @@ uint32_t tox_max_message_length(void);
/**
* Maximum size of custom packets. TODO(iphydf): should be LENGTH?
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
#define TOX_MAX_CUSTOM_PACKET_SIZE 1373
@@ -315,6 +325,8 @@ uint32_t tox_file_id_length(void);
/**
* Maximum file name length for file transfers.
+ *
+ * @deprecated The macro will be removed in 0.3.0. Use the function instead.
*/
#define TOX_MAX_FILENAME_LENGTH 255
@@ -371,12 +383,6 @@ typedef enum TOX_MESSAGE_TYPE {
*/
TOX_MESSAGE_TYPE_ACTION,
- /**
- * Correction of the last message. With empty message body can be used to mark
- * last message as deleted.
- */
- TOX_MESSAGE_TYPE_CORRECTION,
-
} TOX_MESSAGE_TYPE;
@@ -500,7 +506,7 @@ typedef void tox_log_cb(Tox *tox, TOX_LOG_LEVEL level, const char *file, uint32_
* @deprecated The memory layout of this struct (size, alignment, and field
* order) is not part of the ABI. To remain compatible, prefer to use tox_options_new to
* allocate the object and accessor functions to set the members. The struct
- * will become opaque (i.e. the definition will become private) in v0.2.0.
+ * will become opaque (i.e. the definition will become private) in v0.3.0.
*/
struct Tox_Options {
@@ -962,6 +968,9 @@ typedef enum TOX_CONNECTION {
/**
* Return whether we are connected to the DHT. The return value is equal to the
* last value received through the `self_connection_status` callback.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
TOX_CONNECTION tox_self_get_connection_status(const Tox *tox);
@@ -1531,6 +1540,9 @@ void tox_callback_friend_status_message(Tox *tox, tox_friend_status_message_cb *
*
* The status returned is equal to the last status received through the
* `friend_status` callback.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
TOX_USER_STATUS tox_friend_get_status(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error);
@@ -1560,6 +1572,9 @@ void tox_callback_friend_status(Tox *tox, tox_friend_status_cb *callback);
*
* @return the friend's connection status as it was received through the
* `friend_connection_status` event.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
TOX_CONNECTION tox_friend_get_connection_status(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error);
@@ -1592,6 +1607,9 @@ void tox_callback_friend_connection_status(Tox *tox, tox_friend_connection_statu
* @return true if the friend is typing.
* @return false if the friend is not typing, or the friend number was
* invalid. Inspect the error code to determine which case it is.
+ *
+ * @deprecated This getter is deprecated. Use the event and store the status
+ * in the client state.
*/
bool tox_friend_get_typing(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error);
@@ -2394,43 +2412,36 @@ typedef void tox_conference_title_cb(Tox *tox, uint32_t conference_number, uint3
void tox_callback_conference_title(Tox *tox, tox_conference_title_cb *callback);
/**
- * Peer list state change types.
+ * @param conference_number The conference number of the conference the
+ * peer is in.
+ * @param peer_number The ID of the peer who changed their nickname.
+ * @param name A byte array containing the new nickname.
+ * @param length The size of the name byte array.
*/
-typedef enum TOX_CONFERENCE_STATE_CHANGE {
+typedef void tox_conference_peer_name_cb(Tox *tox, uint32_t conference_number, uint32_t peer_number,
+ const uint8_t *name, size_t length, void *user_data);
- /**
- * A peer has joined the conference.
- */
- TOX_CONFERENCE_STATE_CHANGE_PEER_JOIN,
-
- /**
- * A peer has exited the conference.
- */
- TOX_CONFERENCE_STATE_CHANGE_PEER_EXIT,
-
- /**
- * A peer has changed their name.
- */
- TOX_CONFERENCE_STATE_CHANGE_PEER_NAME_CHANGE,
-
-} TOX_CONFERENCE_STATE_CHANGE;
+/**
+ * Set the callback for the `conference_peer_name` event. Pass NULL to unset.
+ *
+ * This event is triggered when a peer changes their name.
+ */
+void tox_callback_conference_peer_name(Tox *tox, tox_conference_peer_name_cb *callback);
/**
- * @param conference_number The conference number of the conference the title change is intended for.
- * @param peer_number The ID of the peer who changed the title.
- * @param change The type of change (one of TOX_CONFERENCE_STATE_CHANGE).
+ * @param conference_number The conference number of the conference the
+ * peer is in.
*/
-typedef void tox_conference_namelist_change_cb(Tox *tox, uint32_t conference_number, uint32_t peer_number,
- TOX_CONFERENCE_STATE_CHANGE change, void *user_data);
+typedef void tox_conference_peer_list_changed_cb(Tox *tox, uint32_t conference_number, void *user_data);
/**
- * Set the callback for the `conference_namelist_change` event. Pass NULL to unset.
+ * Set the callback for the `conference_peer_list_changed` event. Pass NULL to unset.
*
- * This event is triggered when the peer list changes (name change, peer join, peer exit).
+ * This event is triggered when a peer joins or leaves the conference.
*/
-void tox_callback_conference_namelist_change(Tox *tox, tox_conference_namelist_change_cb *callback);
+void tox_callback_conference_peer_list_changed(Tox *tox, tox_conference_peer_list_changed_cb *callback);
typedef enum TOX_ERR_CONFERENCE_NEW {
diff --git a/protocols/Tox/libtox/src/toxcore/tox_api.c b/protocols/Tox/libtox/src/toxcore/tox_api.c
index b6c8c38618..6c0bd71fca 100644
--- a/protocols/Tox/libtox/src/toxcore/tox_api.c
+++ b/protocols/Tox/libtox/src/toxcore/tox_api.c
@@ -1,5 +1,7 @@
#include "tox.h"
+#include "ccompat.h"
+
#include <stdlib.h>
#include <string.h>
@@ -38,20 +40,20 @@ void tox_options_set_##ns##name(struct Tox_Options *options, type name) \
options->ns##name = name; \
}
-ACCESSORS(bool, , ipv6_enabled)
-ACCESSORS(bool, , udp_enabled)
-ACCESSORS(TOX_PROXY_TYPE, proxy_ , type)
-ACCESSORS(const char *, proxy_ , host)
-ACCESSORS(uint16_t, proxy_ , port)
-ACCESSORS(uint16_t, , start_port)
-ACCESSORS(uint16_t, , end_port)
-ACCESSORS(uint16_t, , tcp_port)
-ACCESSORS(bool, , hole_punching_enabled)
+ACCESSORS(bool,, ipv6_enabled)
+ACCESSORS(bool,, udp_enabled)
+ACCESSORS(TOX_PROXY_TYPE, proxy_, type)
+ACCESSORS(const char *, proxy_, host)
+ACCESSORS(uint16_t, proxy_, port)
+ACCESSORS(uint16_t,, start_port)
+ACCESSORS(uint16_t,, end_port)
+ACCESSORS(uint16_t,, tcp_port)
+ACCESSORS(bool,, hole_punching_enabled)
ACCESSORS(TOX_SAVEDATA_TYPE, savedata_, type)
ACCESSORS(size_t, savedata_, length)
ACCESSORS(tox_log_cb *, log_, callback)
ACCESSORS(void *, log_, user_data)
-ACCESSORS(bool, , local_discovery_enabled)
+ACCESSORS(bool,, local_discovery_enabled)
const uint8_t *tox_options_get_savedata_data(const struct Tox_Options *options)
{
@@ -88,7 +90,7 @@ struct Tox_Options *tox_options_new(TOX_ERR_OPTIONS_NEW *error)
}
SET_ERROR_PARAMETER(error, TOX_ERR_OPTIONS_NEW_MALLOC);
- return NULL;
+ return nullptr;
}
void tox_options_free(struct Tox_Options *options)
diff --git a/protocols/Tox/libtox/src/toxcore/util.c b/protocols/Tox/libtox/src/toxcore/util.c
index 92bbb68c1f..b7a8fda653 100644
--- a/protocols/Tox/libtox/src/toxcore/util.c
+++ b/protocols/Tox/libtox/src/toxcore/util.c
@@ -27,7 +27,9 @@
#include "config.h"
#endif
+#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 600
+#endif
#include "util.h"
@@ -46,7 +48,7 @@ static uint64_t unix_base_time_value;
void unix_time_update(void)
{
if (unix_base_time_value == 0) {
- unix_base_time_value = ((uint64_t)time(NULL) - (current_time_monotonic() / 1000ULL));
+ unix_base_time_value = ((uint64_t)time(nullptr) - (current_time_monotonic() / 1000ULL));
}
unix_time_value = (current_time_monotonic() / 1000ULL) + unix_base_time_value;
@@ -128,7 +130,6 @@ int load_state(load_state_callback_func load_state_callback, Logger *log, void *
}
- uint16_t type;
uint32_t length_sub, cookie_type;
uint32_t size_head = sizeof(uint32_t) * 2;
@@ -150,9 +151,8 @@ int load_state(load_state_callback_func load_state_callback, Logger *log, void *
return -1;
}
- type = lendian_to_host16(cookie_type & 0xFFFF);
-
- int ret = load_state_callback(outer, data, length_sub, type);
+ const uint16_t type = lendian_to_host16(cookie_type & 0xFFFF);
+ const int ret = load_state_callback(outer, data, length_sub, type);
if (ret == -1) {
return -1;
@@ -193,3 +193,13 @@ int create_recursive_mutex(pthread_mutex_t *mutex)
return 0;
}
+
+int32_t max_s32(int32_t a, int32_t b)
+{
+ return a > b ? a : b;
+}
+
+uint64_t min_u64(uint64_t a, uint64_t b)
+{
+ return a < b ? a : b;
+}
diff --git a/protocols/Tox/libtox/src/toxcore/util.h b/protocols/Tox/libtox/src/toxcore/util.h
index 8777e191d8..a9faa86349 100644
--- a/protocols/Tox/libtox/src/toxcore/util.h
+++ b/protocols/Tox/libtox/src/toxcore/util.h
@@ -32,6 +32,10 @@
#include "logger.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#define MIN(a,b) (((a)<(b))?(a):(b))
#define PAIR(TYPE1__, TYPE2__) struct { TYPE1__ first; TYPE2__ second; }
@@ -61,4 +65,11 @@ int load_state(load_state_callback_func load_state_callback, Logger *log, void *
/* Returns -1 if failed or 0 if success */
int create_recursive_mutex(pthread_mutex_t *mutex);
+int32_t max_s32(int32_t a, int32_t b);
+uint64_t min_u64(uint64_t a, uint64_t b);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
#endif /* UTIL_H */
diff --git a/protocols/Tox/libtox/src/toxcore/util_test.cpp b/protocols/Tox/libtox/src/toxcore/util_test.cpp
new file mode 100644
index 0000000000..8de6384848
--- /dev/null
+++ b/protocols/Tox/libtox/src/toxcore/util_test.cpp
@@ -0,0 +1,55 @@
+#include "util.h"
+
+#include "crypto_core.h"
+
+#include <gtest/gtest.h>
+
+TEST(Util, UnixTimeIncreasesOverTime)
+{
+ unix_time_update();
+ uint64_t const start = unix_time();
+
+ while (start == unix_time()) {
+ unix_time_update();
+ }
+
+ uint64_t const end = unix_time();
+ EXPECT_GT(end, start);
+}
+
+TEST(Util, IsTimeout)
+{
+ uint64_t const start = unix_time();
+ EXPECT_FALSE(is_timeout(start, 1));
+
+ while (start == unix_time()) {
+ unix_time_update();
+ }
+
+ EXPECT_TRUE(is_timeout(start, 1));
+}
+
+TEST(Util, TwoRandomIdsAreNotEqual)
+{
+ uint8_t pk1[CRYPTO_PUBLIC_KEY_SIZE];
+ uint8_t sk1[CRYPTO_SECRET_KEY_SIZE];
+ uint8_t pk2[CRYPTO_PUBLIC_KEY_SIZE];
+ uint8_t sk2[CRYPTO_SECRET_KEY_SIZE];
+
+ crypto_new_keypair(pk1, sk1);
+ crypto_new_keypair(pk2, sk2);
+
+ EXPECT_FALSE(id_equal(pk1, pk2));
+}
+
+TEST(Util, IdCopyMakesKeysEqual)
+{
+ uint8_t pk1[CRYPTO_PUBLIC_KEY_SIZE];
+ uint8_t sk1[CRYPTO_SECRET_KEY_SIZE];
+ uint8_t pk2[CRYPTO_PUBLIC_KEY_SIZE] = {0};
+
+ crypto_new_keypair(pk1, sk1);
+ id_copy(pk2, pk1);
+
+ EXPECT_TRUE(id_equal(pk1, pk2));
+}
diff --git a/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c b/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c
index b7360b5650..b83d6f1c6c 100644
--- a/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c
+++ b/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c
@@ -25,6 +25,7 @@
#include "config.h"
#endif
+#include "../toxcore/ccompat.h"
#include "../toxcore/crypto_core.h"
#include "defines.h"
#include "toxencryptsave.h"
@@ -134,7 +135,7 @@ Tox_Pass_Key *tox_pass_key_derive_with_salt(const uint8_t *passphrase, size_t pp
{
if (!salt || (!passphrase && pplength != 0)) {
SET_ERROR_PARAMETER(error, TOX_ERR_KEY_DERIVATION_NULL);
- return NULL;
+ return nullptr;
}
uint8_t passkey[crypto_hash_sha256_BYTES];
@@ -152,7 +153,7 @@ Tox_Pass_Key *tox_pass_key_derive_with_salt(const uint8_t *passphrase, size_t pp
crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE) != 0) {
/* out of memory most likely */
SET_ERROR_PARAMETER(error, TOX_ERR_KEY_DERIVATION_FAILED);
- return NULL;
+ return nullptr;
}
sodium_memzero(passkey, crypto_hash_sha256_BYTES); /* wipe plaintext pw */
@@ -161,7 +162,7 @@ Tox_Pass_Key *tox_pass_key_derive_with_salt(const uint8_t *passphrase, size_t pp
if (!out_key) {
SET_ERROR_PARAMETER(error, TOX_ERR_KEY_DERIVATION_FAILED);
- return NULL;
+ return nullptr;
}
memcpy(out_key->salt, salt, crypto_pwhash_scryptsalsa208sha256_SALTBYTES);
@@ -320,7 +321,7 @@ bool tox_pass_decrypt(const uint8_t *data, size_t length, const uint8_t *passphr
memcpy(salt, data + TOX_ENC_SAVE_MAGIC_LENGTH, crypto_pwhash_scryptsalsa208sha256_SALTBYTES);
/* derive the key */
- Tox_Pass_Key *key = tox_pass_key_derive_with_salt(passphrase, pplength, salt, NULL);
+ Tox_Pass_Key *key = tox_pass_key_derive_with_salt(passphrase, pplength, salt, nullptr);
if (!key) {
/* out of memory most likely */