summaryrefslogtreecommitdiff
path: root/toxcore/Messenger.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r--toxcore/Messenger.c78
1 files changed, 42 insertions, 36 deletions
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c
index a7e0a9fe..dc0e605a 100644
--- a/toxcore/Messenger.c
+++ b/toxcore/Messenger.c
@@ -52,24 +52,6 @@ static uint8_t friend_not_valid(const Messenger *m, int32_t friendnumber)
52 return 1; 52 return 1;
53} 53}
54 54
55static int add_online_friend(Messenger *m, int32_t friendnumber)
56{
57 if (friend_not_valid(m, friendnumber))
58 return -1;
59
60 ++m->numonline_friends;
61 return 0;
62}
63
64
65static int remove_online_friend(Messenger *m, int32_t friendnumber)
66{
67 if (friend_not_valid(m, friendnumber))
68 return -1;
69
70 --m->numonline_friends;
71 return 0;
72}
73/* Set the size of the friend list to numfriends. 55/* Set the size of the friend list to numfriends.
74 * 56 *
75 * return -1 if realloc fails. 57 * return -1 if realloc fails.
@@ -399,9 +381,6 @@ int m_delfriend(Messenger *m, int32_t friendnumber)
399 if (friend_not_valid(m, friendnumber)) 381 if (friend_not_valid(m, friendnumber))
400 return -1; 382 return -1;
401 383
402 if (m->friendlist[friendnumber].status == FRIEND_ONLINE)
403 remove_online_friend(m, friendnumber);
404
405 clear_receipts(m, friendnumber); 384 clear_receipts(m, friendnumber);
406 remove_request_received(&(m->fr), m->friendlist[friendnumber].real_pk); 385 remove_request_received(&(m->fr), m->friendlist[friendnumber].real_pk);
407 friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, 0, 0, 0, 0, 0); 386 friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, 0, 0, 0, 0, 0);
@@ -884,10 +863,7 @@ static void check_friend_connectionstatus(Messenger *m, int32_t friendnumber, ui
884 if (is_online != was_online) { 863 if (is_online != was_online) {
885 if (was_online) { 864 if (was_online) {
886 break_files(m, friendnumber); 865 break_files(m, friendnumber);
887 remove_online_friend(m, friendnumber);
888 clear_receipts(m, friendnumber); 866 clear_receipts(m, friendnumber);
889 } else {
890 add_online_friend(m, friendnumber);
891 } 867 }
892 868
893 m->friendlist[friendnumber].status = status; 869 m->friendlist[friendnumber].status = status;
@@ -1831,6 +1807,27 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error)
1831 return NULL; 1807 return NULL;
1832 } 1808 }
1833 1809
1810 if (options->tcp_server_port) {
1811 m->tcp_server = new_TCP_server(options->ipv6enabled, 1, &options->tcp_server_port, m->dht->self_public_key,
1812 m->dht->self_secret_key, m->onion);
1813
1814 if (m->tcp_server == NULL) {
1815 kill_friend_connections(m->fr_c);
1816 kill_onion(m->onion);
1817 kill_onion_announce(m->onion_a);
1818 kill_onion_client(m->onion_c);
1819 kill_DHT(m->dht);
1820 kill_net_crypto(m->net_crypto);
1821 kill_networking(m->net);
1822 free(m);
1823
1824 if (error)
1825 *error = MESSENGER_ERROR_TCP_SERVER;
1826
1827 return NULL;
1828 }
1829 }
1830
1834 m->options = *options; 1831 m->options = *options;
1835 friendreq_init(&(m->fr), m->fr_c); 1832 friendreq_init(&(m->fr), m->fr_c);
1836 set_nospam(&(m->fr), random_int()); 1833 set_nospam(&(m->fr), random_int());
@@ -1850,6 +1847,10 @@ void kill_messenger(Messenger *m)
1850 1847
1851 uint32_t i; 1848 uint32_t i;
1852 1849
1850 if (m->tcp_server) {
1851 kill_TCP_server(m->tcp_server);
1852 }
1853
1853 kill_friend_connections(m->fr_c); 1854 kill_friend_connections(m->fr_c);
1854 kill_onion(m->onion); 1855 kill_onion(m->onion);
1855 kill_onion_announce(m->onion_a); 1856 kill_onion_announce(m->onion_a);
@@ -2285,6 +2286,15 @@ void do_messenger(Messenger *m)
2285 for (i = 0; i < NUM_SAVED_TCP_RELAYS; ++i) { 2286 for (i = 0; i < NUM_SAVED_TCP_RELAYS; ++i) {
2286 add_tcp_relay(m->net_crypto, m->loaded_relays[i].ip_port, m->loaded_relays[i].public_key); 2287 add_tcp_relay(m->net_crypto, m->loaded_relays[i].ip_port, m->loaded_relays[i].public_key);
2287 } 2288 }
2289
2290 if (m->tcp_server) {
2291 /* Add self tcp server. */
2292 IP_Port local_ip_port;
2293 local_ip_port.port = m->options.tcp_server_port;
2294 local_ip_port.ip.family = AF_INET;
2295 local_ip_port.ip.ip4.uint32 = INADDR_LOOPBACK;
2296 add_tcp_relay(m->net_crypto, local_ip_port, m->tcp_server->public_key);
2297 }
2288 } 2298 }
2289 2299
2290 unix_time_update(); 2300 unix_time_update();
@@ -2294,6 +2304,10 @@ void do_messenger(Messenger *m)
2294 do_DHT(m->dht); 2304 do_DHT(m->dht);
2295 } 2305 }
2296 2306
2307 if (m->tcp_server) {
2308 do_TCP_server(m->tcp_server);
2309 }
2310
2297 do_net_crypto(m->net_crypto); 2311 do_net_crypto(m->net_crypto);
2298 do_onion_client(m->onion_c); 2312 do_onion_client(m->onion_c);
2299 do_friend_connections(m->fr_c); 2313 do_friend_connections(m->fr_c);
@@ -2622,13 +2636,11 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3
2622 case MESSENGER_STATE_TYPE_NOSPAMKEYS: 2636 case MESSENGER_STATE_TYPE_NOSPAMKEYS:
2623 if (length == crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t)) { 2637 if (length == crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t)) {
2624 set_nospam(&(m->fr), *(uint32_t *)data); 2638 set_nospam(&(m->fr), *(uint32_t *)data);
2625 load_keys(m->net_crypto, &data[sizeof(uint32_t)]); 2639 load_secret_key(m->net_crypto, (&data[sizeof(uint32_t)]) + crypto_box_PUBLICKEYBYTES);
2626#ifdef ENABLE_ASSOC_DHT
2627 2640
2628 if (m->dht->assoc) 2641 if (memcmp((&data[sizeof(uint32_t)]), m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES) != 0) {
2629 Assoc_self_client_id_changed(m->dht->assoc, m->net_crypto->self_public_key); 2642 return -1;
2630 2643 }
2631#endif
2632 } else 2644 } else
2633 return -1; /* critical */ 2645 return -1; /* critical */
2634 2646
@@ -2738,12 +2750,6 @@ uint32_t count_friendlist(const Messenger *m)
2738 return ret; 2750 return ret;
2739} 2751}
2740 2752
2741/* Return the number of online friends in the instance m. */
2742uint32_t get_num_online_friends(const Messenger *m)
2743{
2744 return m->numonline_friends;
2745}
2746
2747/* Copy a list of valid friend IDs into the array out_list. 2753/* Copy a list of valid friend IDs into the array out_list.
2748 * If out_list is NULL, returns 0. 2754 * If out_list is NULL, returns 0.
2749 * Otherwise, returns the number of elements copied. 2755 * Otherwise, returns the number of elements copied.