diff options
-rw-r--r-- | auto_tests/messenger_test.c | 8 | ||||
-rw-r--r-- | auto_tests/network_test.c | 308 | ||||
-rw-r--r-- | testing/nTox.c | 16 | ||||
-rw-r--r-- | toxcore/DHT.c | 2 | ||||
-rw-r--r-- | toxcore/Messenger.c | 26 | ||||
-rw-r--r-- | toxcore/Messenger.h | 14 | ||||
-rw-r--r-- | toxcore/group_chats.c | 22 | ||||
-rw-r--r-- | toxcore/group_chats.h | 13 | ||||
-rw-r--r-- | toxcore/net_crypto.c | 4 | ||||
-rw-r--r-- | toxcore/tox.c | 16 | ||||
-rw-r--r-- | toxcore/tox.h | 12 | ||||
-rw-r--r-- | toxcore/util.h | 2 |
12 files changed, 270 insertions, 173 deletions
diff --git a/auto_tests/messenger_test.c b/auto_tests/messenger_test.c index dc1625a3..f749f6cb 100644 --- a/auto_tests/messenger_test.c +++ b/auto_tests/messenger_test.c | |||
@@ -239,12 +239,14 @@ START_TEST(test_dht_state_saveloadsave) | |||
239 | memset(buffer, 0xCD, extra); | 239 | memset(buffer, 0xCD, extra); |
240 | memset(buffer + extra + size, 0xCD, extra); | 240 | memset(buffer + extra + size, 0xCD, extra); |
241 | DHT_save(m->dht, buffer + extra); | 241 | DHT_save(m->dht, buffer + extra); |
242 | for(i = 0; i < extra; i++) { | 242 | |
243 | for (i = 0; i < extra; i++) { | ||
243 | ck_assert_msg(buffer[i] == 0xCD, "Buffer underwritten from DHT_save() @%u", i); | 244 | ck_assert_msg(buffer[i] == 0xCD, "Buffer underwritten from DHT_save() @%u", i); |
244 | ck_assert_msg(buffer[extra + size + i] == 0xCD, "Buffer overwritten from DHT_save() @%u", i); | 245 | ck_assert_msg(buffer[extra + size + i] == 0xCD, "Buffer overwritten from DHT_save() @%u", i); |
245 | } | 246 | } |
246 | 247 | ||
247 | int res = DHT_load_new(m->dht, buffer + extra, size); | 248 | int res = DHT_load_new(m->dht, buffer + extra, size); |
249 | |||
248 | if (res == -1) | 250 | if (res == -1) |
249 | ck_assert_msg(res == 0, "Failed to load back stored buffer: res == -1"); | 251 | ck_assert_msg(res == 0, "Failed to load back stored buffer: res == -1"); |
250 | else { | 252 | else { |
@@ -279,12 +281,14 @@ START_TEST(test_messenger_state_saveloadsave) | |||
279 | memset(buffer, 0xCD, extra); | 281 | memset(buffer, 0xCD, extra); |
280 | memset(buffer + extra + size, 0xCD, extra); | 282 | memset(buffer + extra + size, 0xCD, extra); |
281 | Messenger_save(m, buffer + extra); | 283 | Messenger_save(m, buffer + extra); |
282 | for(i = 0; i < extra; i++) { | 284 | |
285 | for (i = 0; i < extra; i++) { | ||
283 | ck_assert_msg(buffer[i] == 0xCD, "Buffer underwritten from Messenger_save() @%u", i); | 286 | ck_assert_msg(buffer[i] == 0xCD, "Buffer underwritten from Messenger_save() @%u", i); |
284 | ck_assert_msg(buffer[extra + size + i] == 0xCD, "Buffer overwritten from Messenger_save() @%u", i); | 287 | ck_assert_msg(buffer[extra + size + i] == 0xCD, "Buffer overwritten from Messenger_save() @%u", i); |
285 | } | 288 | } |
286 | 289 | ||
287 | int res = Messenger_load(m, buffer + extra, size); | 290 | int res = Messenger_load(m, buffer + extra, size); |
291 | |||
288 | if (res == -1) | 292 | if (res == -1) |
289 | ck_assert_msg(res == 0, "Failed to load back stored buffer: res == -1"); | 293 | ck_assert_msg(res == 0, "Failed to load back stored buffer: res == -1"); |
290 | else { | 294 | else { |
diff --git a/auto_tests/network_test.c b/auto_tests/network_test.c index 593b1f40..8d2a12d9 100644 --- a/auto_tests/network_test.c +++ b/auto_tests/network_test.c | |||
@@ -1,154 +1,154 @@ | |||
1 | #ifdef HAVE_CONFIG_H | 1 | #ifdef HAVE_CONFIG_H |
2 | #include "config.h" | 2 | #include "config.h" |
3 | #endif | 3 | #endif |
4 | 4 | ||
5 | #include <sys/types.h> | 5 | #include <sys/types.h> |
6 | #include <stdint.h> | 6 | #include <stdint.h> |
7 | #include <string.h> | 7 | #include <string.h> |
8 | #include <check.h> | 8 | #include <check.h> |
9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
10 | #include <time.h> | 10 | #include <time.h> |
11 | 11 | ||
12 | #include "../toxcore/network.h" | 12 | #include "../toxcore/network.h" |
13 | 13 | ||
14 | START_TEST(test_addr_resolv_localhost) | 14 | START_TEST(test_addr_resolv_localhost) |
15 | { | 15 | { |
16 | #ifdef __CYGWIN__ | 16 | #ifdef __CYGWIN__ |
17 | /* force initialization of network stack | 17 | /* force initialization of network stack |
18 | * normally this should happen automatically | 18 | * normally this should happen automatically |
19 | * cygwin doesn't do it for every network related function though | 19 | * cygwin doesn't do it for every network related function though |
20 | * e.g. not for getaddrinfo... */ | 20 | * e.g. not for getaddrinfo... */ |
21 | socket(0, 0, 0); | 21 | socket(0, 0, 0); |
22 | errno = 0; | 22 | errno = 0; |
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | const char localhost[] = "localhost"; | 25 | const char localhost[] = "localhost"; |
26 | 26 | ||
27 | IP ip; | 27 | IP ip; |
28 | ip_init(&ip, 0); | 28 | ip_init(&ip, 0); |
29 | 29 | ||
30 | int res = addr_resolve(localhost, &ip, NULL); | 30 | int res = addr_resolve(localhost, &ip, NULL); |
31 | 31 | ||
32 | ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno)); | 32 | ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno)); |
33 | 33 | ||
34 | if (res > 0) { | 34 | if (res > 0) { |
35 | ck_assert_msg(ip.family == AF_INET, "Expected family AF_INET, got %u.", ip.family); | 35 | ck_assert_msg(ip.family == AF_INET, "Expected family AF_INET, got %u.", ip.family); |
36 | ck_assert_msg(ip.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(ip.ip4.in_addr)); | 36 | ck_assert_msg(ip.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(ip.ip4.in_addr)); |
37 | } | 37 | } |
38 | 38 | ||
39 | ip_init(&ip, 1); | 39 | ip_init(&ip, 1); |
40 | res = addr_resolve(localhost, &ip, NULL); | 40 | res = addr_resolve(localhost, &ip, NULL); |
41 | 41 | ||
42 | ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno)); | 42 | ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno)); |
43 | 43 | ||
44 | if (res > 0) { | 44 | if (res > 0) { |
45 | ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6, got %u.", ip.family); | 45 | ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6, got %u.", ip.family); |
46 | ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip)); | 46 | ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip)); |
47 | } | 47 | } |
48 | 48 | ||
49 | ip_init(&ip, 1); | 49 | ip_init(&ip, 1); |
50 | ip.family = AF_UNSPEC; | 50 | ip.family = AF_UNSPEC; |
51 | IP extra; | 51 | IP extra; |
52 | ip_reset(&extra); | 52 | ip_reset(&extra); |
53 | res = addr_resolve(localhost, &ip, &extra); | 53 | res = addr_resolve(localhost, &ip, &extra); |
54 | 54 | ||
55 | ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno)); | 55 | ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno)); |
56 | 56 | ||
57 | if (res > 0) { | 57 | if (res > 0) { |
58 | ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6, got %u.", ip.family); | 58 | ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6, got %u.", ip.family); |
59 | ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip)); | 59 | ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip)); |
60 | 60 | ||
61 | ck_assert_msg(extra.family == AF_INET, "Expected family AF_INET, got %u.", extra.family); | 61 | ck_assert_msg(extra.family == AF_INET, "Expected family AF_INET, got %u.", extra.family); |
62 | ck_assert_msg(extra.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(extra.ip4.in_addr)); | 62 | ck_assert_msg(extra.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(extra.ip4.in_addr)); |
63 | } | 63 | } |
64 | } | 64 | } |
65 | END_TEST | 65 | END_TEST |
66 | 66 | ||
67 | START_TEST(test_ip_equal) | 67 | START_TEST(test_ip_equal) |
68 | { | 68 | { |
69 | int res; | 69 | int res; |
70 | IP ip1, ip2; | 70 | IP ip1, ip2; |
71 | ip_reset(&ip1); | 71 | ip_reset(&ip1); |
72 | ip_reset(&ip2); | 72 | ip_reset(&ip2); |
73 | 73 | ||
74 | res = ip_equal(NULL, NULL); | 74 | res = ip_equal(NULL, NULL); |
75 | ck_assert_msg(res == 0, "ip_equal(NULL, NULL): expected result 0, got %u.", res); | 75 | ck_assert_msg(res == 0, "ip_equal(NULL, NULL): expected result 0, got %u.", res); |
76 | 76 | ||
77 | res = ip_equal(&ip1, NULL); | 77 | res = ip_equal(&ip1, NULL); |
78 | ck_assert_msg(res == 0, "ip_equal(PTR, NULL): expected result 0, got %u.", res); | 78 | ck_assert_msg(res == 0, "ip_equal(PTR, NULL): expected result 0, got %u.", res); |
79 | 79 | ||
80 | res = ip_equal(NULL, &ip1); | 80 | res = ip_equal(NULL, &ip1); |
81 | ck_assert_msg(res == 0, "ip_equal(NULL, PTR): expected result 0, got %u.", res); | 81 | ck_assert_msg(res == 0, "ip_equal(NULL, PTR): expected result 0, got %u.", res); |
82 | 82 | ||
83 | ip1.family = AF_INET; | 83 | ip1.family = AF_INET; |
84 | ip1.ip4.uint32 = htonl(0x7F000001); | 84 | ip1.ip4.uint32 = htonl(0x7F000001); |
85 | 85 | ||
86 | res = ip_equal(&ip1, &ip2); | 86 | res = ip_equal(&ip1, &ip2); |
87 | ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_UNSPEC, 0} ): expected result 0, got %u.", res); | 87 | ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_UNSPEC, 0} ): expected result 0, got %u.", res); |
88 | 88 | ||
89 | ip2.family = AF_INET; | 89 | ip2.family = AF_INET; |
90 | ip2.ip4.uint32 = htonl(0x7F000001); | 90 | ip2.ip4.uint32 = htonl(0x7F000001); |
91 | 91 | ||
92 | res = ip_equal(&ip1, &ip2); | 92 | res = ip_equal(&ip1, &ip2); |
93 | ck_assert_msg(res != 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET, 127.0.0.1} ): expected result != 0, got 0."); | 93 | ck_assert_msg(res != 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET, 127.0.0.1} ): expected result != 0, got 0."); |
94 | 94 | ||
95 | ip2.ip4.uint32 = htonl(0x7F000002); | 95 | ip2.ip4.uint32 = htonl(0x7F000002); |
96 | 96 | ||
97 | res = ip_equal(&ip1, &ip2); | 97 | res = ip_equal(&ip1, &ip2); |
98 | ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET, 127.0.0.2} ): expected result 0, got %u.", res); | 98 | ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET, 127.0.0.2} ): expected result 0, got %u.", res); |
99 | 99 | ||
100 | ip2.family = AF_INET6; | 100 | ip2.family = AF_INET6; |
101 | ip2.ip6.uint32[0] = 0; | 101 | ip2.ip6.uint32[0] = 0; |
102 | ip2.ip6.uint32[1] = 0; | 102 | ip2.ip6.uint32[1] = 0; |
103 | ip2.ip6.uint32[2] = htonl(0xFFFF); | 103 | ip2.ip6.uint32[2] = htonl(0xFFFF); |
104 | ip2.ip6.uint32[3] = htonl(0x7F000001); | 104 | ip2.ip6.uint32[3] = htonl(0x7F000001); |
105 | 105 | ||
106 | ck_assert_msg(IN6_IS_ADDR_V4MAPPED(&ip2.ip6) != 0, "IN6_IS_ADDR_V4MAPPED(::ffff:127.0.0.1): expected != 0, got 0."); | 106 | ck_assert_msg(IN6_IS_ADDR_V4MAPPED(&ip2.ip6) != 0, "IN6_IS_ADDR_V4MAPPED(::ffff:127.0.0.1): expected != 0, got 0."); |
107 | 107 | ||
108 | res = ip_equal(&ip1, &ip2); | 108 | res = ip_equal(&ip1, &ip2); |
109 | ck_assert_msg(res != 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET6, ::ffff:127.0.0.1} ): expected result != 0, got 0."); | 109 | ck_assert_msg(res != 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET6, ::ffff:127.0.0.1} ): expected result != 0, got 0."); |
110 | 110 | ||
111 | memcpy(&ip2.ip6, &in6addr_loopback, sizeof(IP6)); | 111 | memcpy(&ip2.ip6, &in6addr_loopback, sizeof(IP6)); |
112 | res = ip_equal(&ip1, &ip2); | 112 | res = ip_equal(&ip1, &ip2); |
113 | ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET6, ::1} ): expected result 0, got %u.", res); | 113 | ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET6, ::1} ): expected result 0, got %u.", res); |
114 | 114 | ||
115 | memcpy(&ip1, &ip2, sizeof(IP)); | 115 | memcpy(&ip1, &ip2, sizeof(IP)); |
116 | res = ip_equal(&ip1, &ip2); | 116 | res = ip_equal(&ip1, &ip2); |
117 | ck_assert_msg(res != 0, "ip_equal( {AF_INET6, ::1}, {AF_INET6, ::1} ): expected result != 0, got 0."); | 117 | ck_assert_msg(res != 0, "ip_equal( {AF_INET6, ::1}, {AF_INET6, ::1} ): expected result != 0, got 0."); |
118 | 118 | ||
119 | ip2.ip6.uint8[15]++; | 119 | ip2.ip6.uint8[15]++; |
120 | res = ip_equal(&ip1, &ip2); | 120 | res = ip_equal(&ip1, &ip2); |
121 | ck_assert_msg(res == 0, "ip_equal( {AF_INET6, ::1}, {AF_INET6, ::2} ): expected result 0, got %res.", res); | 121 | ck_assert_msg(res == 0, "ip_equal( {AF_INET6, ::1}, {AF_INET6, ::2} ): expected result 0, got %res.", res); |
122 | } | 122 | } |
123 | END_TEST | 123 | END_TEST |
124 | 124 | ||
125 | #define DEFTESTCASE(NAME) \ | 125 | #define DEFTESTCASE(NAME) \ |
126 | TCase *NAME = tcase_create(#NAME); \ | 126 | TCase *NAME = tcase_create(#NAME); \ |
127 | tcase_add_test(NAME, test_##NAME); \ | 127 | tcase_add_test(NAME, test_##NAME); \ |
128 | suite_add_tcase(s, NAME); | 128 | suite_add_tcase(s, NAME); |
129 | 129 | ||
130 | Suite *network_suite(void) | 130 | Suite *network_suite(void) |
131 | { | 131 | { |
132 | Suite *s = suite_create("Network"); | 132 | Suite *s = suite_create("Network"); |
133 | 133 | ||
134 | DEFTESTCASE(addr_resolv_localhost); | 134 | DEFTESTCASE(addr_resolv_localhost); |
135 | DEFTESTCASE(ip_equal); | 135 | DEFTESTCASE(ip_equal); |
136 | 136 | ||
137 | return s; | 137 | return s; |
138 | } | 138 | } |
139 | 139 | ||
140 | int main(int argc, char *argv[]) | 140 | int main(int argc, char *argv[]) |
141 | { | 141 | { |
142 | srand((unsigned int) time(NULL)); | 142 | srand((unsigned int) time(NULL)); |
143 | 143 | ||
144 | Suite *network = network_suite(); | 144 | Suite *network = network_suite(); |
145 | SRunner *test_runner = srunner_create(network); | 145 | SRunner *test_runner = srunner_create(network); |
146 | int number_failed = 0; | 146 | int number_failed = 0; |
147 | 147 | ||
148 | srunner_run_all(test_runner, CK_NORMAL); | 148 | srunner_run_all(test_runner, CK_NORMAL); |
149 | number_failed = srunner_ntests_failed(test_runner); | 149 | number_failed = srunner_ntests_failed(test_runner); |
150 | 150 | ||
151 | srunner_free(test_runner); | 151 | srunner_free(test_runner); |
152 | 152 | ||
153 | return number_failed; | 153 | return number_failed; |
154 | } | 154 | } |
diff --git a/testing/nTox.c b/testing/nTox.c index e87b4b83..2e394528 100644 --- a/testing/nTox.c +++ b/testing/nTox.c | |||
@@ -137,6 +137,7 @@ void get_id(Tox *m, char *data) | |||
137 | tox_getaddress(m, address); | 137 | tox_getaddress(m, address); |
138 | 138 | ||
139 | uint32_t i = 0; | 139 | uint32_t i = 0; |
140 | |||
140 | for (; i < TOX_FRIEND_ADDRESS_SIZE; i++) { | 141 | for (; i < TOX_FRIEND_ADDRESS_SIZE; i++) { |
141 | sprintf(data + 2 * i + offset, "%02X ", address[i]); | 142 | sprintf(data + 2 * i + offset, "%02X ", address[i]); |
142 | } | 143 | } |
@@ -257,9 +258,9 @@ void line_eval(Tox *m, char *line) | |||
257 | if (num >= 0) { | 258 | if (num >= 0) { |
258 | sprintf(numstring, "[i] Added friend as %d.", num); | 259 | sprintf(numstring, "[i] Added friend as %d.", num); |
259 | save_data(m); | 260 | save_data(m); |
260 | } | 261 | } else |
261 | else | ||
262 | sprintf(numstring, "[i] Unknown error %i.", num); | 262 | sprintf(numstring, "[i] Unknown error %i.", num); |
263 | |||
263 | break; | 264 | break; |
264 | } | 265 | } |
265 | 266 | ||
@@ -508,12 +509,14 @@ static int load_data(Tox *m) | |||
508 | { | 509 | { |
509 | FILE *data_file = fopen(data_file_name, "r"); | 510 | FILE *data_file = fopen(data_file_name, "r"); |
510 | size_t size = 0; | 511 | size_t size = 0; |
512 | |||
511 | if (data_file) { | 513 | if (data_file) { |
512 | fseek(data_file, 0, SEEK_END); | 514 | fseek(data_file, 0, SEEK_END); |
513 | size = ftell(data_file); | 515 | size = ftell(data_file); |
514 | rewind(data_file); | 516 | rewind(data_file); |
515 | 517 | ||
516 | uint8_t data[size]; | 518 | uint8_t data[size]; |
519 | |||
517 | if (fread(data, sizeof(uint8_t), size, data_file) != size) { | 520 | if (fread(data, sizeof(uint8_t), size, data_file) != size) { |
518 | fputs("[!] could not read data file!\n", stderr); | 521 | fputs("[!] could not read data file!\n", stderr); |
519 | fclose(data_file); | 522 | fclose(data_file); |
@@ -537,6 +540,7 @@ static int load_data(Tox *m) | |||
537 | static int save_data(Tox *m) | 540 | static int save_data(Tox *m) |
538 | { | 541 | { |
539 | FILE *data_file = fopen(data_file_name, "w"); | 542 | FILE *data_file = fopen(data_file_name, "w"); |
543 | |||
540 | if (!data_file) { | 544 | if (!data_file) { |
541 | perror("[!] load_key"); | 545 | perror("[!] load_key"); |
542 | return 0; | 546 | return 0; |
@@ -563,6 +567,7 @@ static int save_data(Tox *m) | |||
563 | static int load_data_or_init(Tox *m, char *path) | 567 | static int load_data_or_init(Tox *m, char *path) |
564 | { | 568 | { |
565 | data_file_name = path; | 569 | data_file_name = path; |
570 | |||
566 | if (load_data(m)) | 571 | if (load_data(m)) |
567 | return 1; | 572 | return 1; |
568 | 573 | ||
@@ -588,10 +593,12 @@ void print_invite(Tox *m, int friendnumber, uint8_t *group_public_key, void *use | |||
588 | new_lines(msg); | 593 | new_lines(msg); |
589 | } | 594 | } |
590 | 595 | ||
591 | void print_groupmessage(Tox *m, int groupnumber, uint8_t *message, uint16_t length, void *userdata) | 596 | void print_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata) |
592 | { | 597 | { |
593 | char msg[256 + length]; | 598 | char msg[256 + length]; |
594 | sprintf(msg, "[g] %u: %s", groupnumber, message); | 599 | uint8_t name[TOX_MAX_NAME_LENGTH]; |
600 | tox_group_peername(m, groupnumber, peernumber, name); | ||
601 | sprintf(msg, "[g] %u: <%s>: %s", groupnumber, name, message); | ||
595 | new_lines(msg); | 602 | new_lines(msg); |
596 | } | 603 | } |
597 | 604 | ||
@@ -669,6 +676,7 @@ int main(int argc, char *argv[]) | |||
669 | new_lines("[i] change username with /n"); | 676 | new_lines("[i] change username with /n"); |
670 | uint8_t name[TOX_MAX_NAME_LENGTH]; | 677 | uint8_t name[TOX_MAX_NAME_LENGTH]; |
671 | uint16_t namelen = tox_getselfname(m, name, sizeof(name)); | 678 | uint16_t namelen = tox_getselfname(m, name, sizeof(name)); |
679 | |||
672 | if (namelen > 0) { | 680 | if (namelen > 0) { |
673 | char whoami[128 + TOX_MAX_NAME_LENGTH]; | 681 | char whoami[128 + TOX_MAX_NAME_LENGTH]; |
674 | snprintf(whoami, sizeof(whoami), "[i] your current username is: %s", name); | 682 | snprintf(whoami, sizeof(whoami), "[i] your current username is: %s", name); |
diff --git a/toxcore/DHT.c b/toxcore/DHT.c index f38ce3a5..84c00c70 100644 --- a/toxcore/DHT.c +++ b/toxcore/DHT.c | |||
@@ -1579,6 +1579,7 @@ void DHT_save(DHT *dht, uint8_t *data) | |||
1579 | len = num * sizeof(Client_data); | 1579 | len = num * sizeof(Client_data); |
1580 | type = DHT_STATE_TYPE_CLIENTS; | 1580 | type = DHT_STATE_TYPE_CLIENTS; |
1581 | data = z_state_save_subheader(data, len, type); | 1581 | data = z_state_save_subheader(data, len, type); |
1582 | |||
1582 | if (num) { | 1583 | if (num) { |
1583 | Client_data *clients = (Client_data *)data; | 1584 | Client_data *clients = (Client_data *)data; |
1584 | 1585 | ||
@@ -1586,6 +1587,7 @@ void DHT_save(DHT *dht, uint8_t *data) | |||
1586 | if (dht->close_clientlist[i].timestamp != 0) | 1587 | if (dht->close_clientlist[i].timestamp != 0) |
1587 | memcpy(&clients[num++], &dht->close_clientlist[i], sizeof(Client_data)); | 1588 | memcpy(&clients[num++], &dht->close_clientlist[i], sizeof(Client_data)); |
1588 | } | 1589 | } |
1590 | |||
1589 | data += len; | 1591 | data += len; |
1590 | } | 1592 | } |
1591 | 1593 | ||
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index d9e085fb..dbbfa58c 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -686,9 +686,9 @@ void m_callback_group_invite(Messenger *m, void (*function)(Messenger *m, int, u | |||
686 | 686 | ||
687 | /* Set the callback for group messages. | 687 | /* Set the callback for group messages. |
688 | * | 688 | * |
689 | * Function(Messenger *m, int groupnumber, uint8_t * message, uint16_t length, void *userdata) | 689 | * Function(Tox *tox, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata) |
690 | */ | 690 | */ |
691 | void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *), | 691 | void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, int, uint8_t *, uint16_t, void *), |
692 | void *userdata) | 692 | void *userdata) |
693 | { | 693 | { |
694 | m->group_message = function; | 694 | m->group_message = function; |
@@ -705,7 +705,7 @@ static void group_message_function(Group_Chat *chat, int peer_number, uint8_t *m | |||
705 | } | 705 | } |
706 | 706 | ||
707 | if (m->group_message) | 707 | if (m->group_message) |
708 | (*m->group_message)(m, i, message, length, m->group_invite_userdata); | 708 | (*m->group_message)(m, i, peer_number, message, length, m->group_invite_userdata); |
709 | } | 709 | } |
710 | 710 | ||
711 | /* Creates a new groupchat and puts it in the chats array. | 711 | /* Creates a new groupchat and puts it in the chats array. |
@@ -788,6 +788,25 @@ int del_groupchat(Messenger *m, int groupnumber) | |||
788 | return 0; | 788 | return 0; |
789 | } | 789 | } |
790 | 790 | ||
791 | /* Copy the name of peernumber who is in groupnumber to name. | ||
792 | * name must be at least MAX_NICK_BYTES long. | ||
793 | * | ||
794 | * return length of name if success | ||
795 | * return -1 if failure | ||
796 | */ | ||
797 | int m_group_peername(Messenger *m, int groupnumber, int peernumber, uint8_t *name) | ||
798 | { | ||
799 | if ((unsigned int)groupnumber >= m->numchats) | ||
800 | return -1; | ||
801 | |||
802 | if (m->chats == NULL) | ||
803 | return -1; | ||
804 | |||
805 | if (m->chats[groupnumber] == NULL) | ||
806 | return -1; | ||
807 | |||
808 | return group_peername(m->chats[groupnumber], peernumber, name); | ||
809 | } | ||
791 | /* return 1 if that friend was invited to the group | 810 | /* return 1 if that friend was invited to the group |
792 | * return 0 if the friend was not or error. | 811 | * return 0 if the friend was not or error. |
793 | */ | 812 | */ |
@@ -1593,6 +1612,7 @@ static int messenger_load_state_callback(void *outer, uint8_t *data, uint32_t le | |||
1593 | break; | 1612 | break; |
1594 | 1613 | ||
1595 | #ifdef DEBUG | 1614 | #ifdef DEBUG |
1615 | |||
1596 | default: | 1616 | default: |
1597 | fprintf(stderr, "Load state: contains unrecognized part (len %u, type %u)\n", | 1617 | fprintf(stderr, "Load state: contains unrecognized part (len %u, type %u)\n", |
1598 | length, type); | 1618 | length, type); |
diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h index bfcc69df..78580dc0 100644 --- a/toxcore/Messenger.h +++ b/toxcore/Messenger.h | |||
@@ -159,7 +159,7 @@ typedef struct Messenger { | |||
159 | void *friend_connectionstatuschange_userdata; | 159 | void *friend_connectionstatuschange_userdata; |
160 | void (*group_invite)(struct Messenger *m, int, uint8_t *, void *); | 160 | void (*group_invite)(struct Messenger *m, int, uint8_t *, void *); |
161 | void *group_invite_userdata; | 161 | void *group_invite_userdata; |
162 | void (*group_message)(struct Messenger *m, int, uint8_t *, uint16_t, void *); | 162 | void (*group_message)(struct Messenger *m, int, int, uint8_t *, uint16_t, void *); |
163 | void *group_message_userdata; | 163 | void *group_message_userdata; |
164 | 164 | ||
165 | } Messenger; | 165 | } Messenger; |
@@ -382,9 +382,9 @@ void m_callback_group_invite(Messenger *m, void (*function)(Messenger *m, int, u | |||
382 | 382 | ||
383 | /* Set the callback for group messages. | 383 | /* Set the callback for group messages. |
384 | * | 384 | * |
385 | * Function(Messenger *m, int groupnumber, uint8_t * message, uint16_t length, void *userdata) | 385 | * Function(Tox *tox, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata) |
386 | */ | 386 | */ |
387 | void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *), | 387 | void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, int, uint8_t *, uint16_t, void *), |
388 | void *userdata); | 388 | void *userdata); |
389 | 389 | ||
390 | /* Creates a new groupchat and puts it in the chats array. | 390 | /* Creates a new groupchat and puts it in the chats array. |
@@ -401,6 +401,14 @@ int add_groupchat(Messenger *m); | |||
401 | */ | 401 | */ |
402 | int del_groupchat(Messenger *m, int groupnumber); | 402 | int del_groupchat(Messenger *m, int groupnumber); |
403 | 403 | ||
404 | /* Copy the name of peernumber who is in groupnumber to name. | ||
405 | * name must be at least MAX_NICK_BYTES long. | ||
406 | * | ||
407 | * return length of name if success | ||
408 | * return -1 if failure | ||
409 | */ | ||
410 | int m_group_peername(Messenger *m, int groupnumber, int peernumber, uint8_t *name); | ||
411 | |||
404 | /* invite friendnumber to groupnumber | 412 | /* invite friendnumber to groupnumber |
405 | * return 0 on success | 413 | * return 0 on success |
406 | * return -1 on failure | 414 | * return -1 on failure |
diff --git a/toxcore/group_chats.c b/toxcore/group_chats.c index f37c6a9c..dc8e158b 100644 --- a/toxcore/group_chats.c +++ b/toxcore/group_chats.c | |||
@@ -278,6 +278,28 @@ static int delpeer(Group_Chat *chat, uint8_t *client_id) | |||
278 | 278 | ||
279 | return -1; | 279 | return -1; |
280 | } | 280 | } |
281 | |||
282 | /* Copy the name of peernum to name. | ||
283 | * name must be at least MAX_NICK_BYTES long. | ||
284 | * | ||
285 | * return length of name if success | ||
286 | * return -1 if failure | ||
287 | */ | ||
288 | int group_peername(Group_Chat *chat, int peernum, uint8_t *name) | ||
289 | { | ||
290 | if ((uint32_t)peernum >= chat->numpeers) | ||
291 | return -1; | ||
292 | |||
293 | if (chat->group[peernum].nick_len == 0) { | ||
294 | memcpy(name, "NSA Agent", 10); /* Kindly remind the user that someone with no name might be a NSA agent.*/ | ||
295 | return 10; | ||
296 | } | ||
297 | |||
298 | memcpy(name, chat->group[peernum].nick, chat->group[peernum].nick_len); | ||
299 | return chat->group[peernum].nick_len; | ||
300 | } | ||
301 | |||
302 | |||
281 | /* min time between pings sent to one peer in seconds */ | 303 | /* min time between pings sent to one peer in seconds */ |
282 | #define PING_TIMEOUT 5 | 304 | #define PING_TIMEOUT 5 |
283 | static int send_getnodes(Group_Chat *chat, IP_Port ip_port, int peernum) | 305 | static int send_getnodes(Group_Chat *chat, IP_Port ip_port, int peernum) |
diff --git a/toxcore/group_chats.h b/toxcore/group_chats.h index 78a5488c..e45f2af2 100644 --- a/toxcore/group_chats.h +++ b/toxcore/group_chats.h | |||
@@ -31,6 +31,8 @@ | |||
31 | extern "C" { | 31 | extern "C" { |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | #define MAX_NICK_BYTES 128 | ||
35 | |||
34 | typedef struct { | 36 | typedef struct { |
35 | uint8_t client_id[crypto_box_PUBLICKEYBYTES]; | 37 | uint8_t client_id[crypto_box_PUBLICKEYBYTES]; |
36 | uint64_t pingid; | 38 | uint64_t pingid; |
@@ -39,6 +41,9 @@ typedef struct { | |||
39 | uint64_t last_recv; | 41 | uint64_t last_recv; |
40 | uint64_t last_recv_msgping; | 42 | uint64_t last_recv_msgping; |
41 | uint32_t last_message_number; | 43 | uint32_t last_message_number; |
44 | |||
45 | uint8_t nick[MAX_NICK_BYTES]; | ||
46 | uint16_t nick_len; | ||
42 | } Group_Peer; | 47 | } Group_Peer; |
43 | 48 | ||
44 | typedef struct { | 49 | typedef struct { |
@@ -65,6 +70,14 @@ typedef struct Group_Chat { | |||
65 | 70 | ||
66 | } Group_Chat; | 71 | } Group_Chat; |
67 | 72 | ||
73 | /* Copy the name of peernum to name. | ||
74 | * name must be at least MAX_NICK_BYTES long. | ||
75 | * | ||
76 | * return length of name if success | ||
77 | * return -1 if failure | ||
78 | */ | ||
79 | int group_peername(Group_Chat *chat, int peernum, uint8_t *name); | ||
80 | |||
68 | /* | 81 | /* |
69 | * Set callback function for chat messages. | 82 | * Set callback function for chat messages. |
70 | * | 83 | * |
diff --git a/toxcore/net_crypto.c b/toxcore/net_crypto.c index 1de32cb0..a2e42557 100644 --- a/toxcore/net_crypto.c +++ b/toxcore/net_crypto.c | |||
@@ -456,7 +456,7 @@ int crypto_connect(Net_Crypto *c, uint8_t *public_key, IP_Port ip_port) | |||
456 | } | 456 | } |
457 | 457 | ||
458 | if (realloc_cryptoconnection(c, c->crypto_connections_length + 1) == -1 | 458 | if (realloc_cryptoconnection(c, c->crypto_connections_length + 1) == -1 |
459 | || c->crypto_connections == NULL) | 459 | || c->crypto_connections == NULL) |
460 | return -1; | 460 | return -1; |
461 | 461 | ||
462 | memset(&(c->crypto_connections[c->crypto_connections_length]), 0, sizeof(Crypto_Connection)); | 462 | memset(&(c->crypto_connections[c->crypto_connections_length]), 0, sizeof(Crypto_Connection)); |
@@ -580,7 +580,7 @@ int accept_crypto_inbound(Net_Crypto *c, int connection_id, uint8_t *public_key, | |||
580 | * } | 580 | * } |
581 | */ | 581 | */ |
582 | if (realloc_cryptoconnection(c, c->crypto_connections_length + 1) == -1 | 582 | if (realloc_cryptoconnection(c, c->crypto_connections_length + 1) == -1 |
583 | || c->crypto_connections == NULL) | 583 | || c->crypto_connections == NULL) |
584 | return -1; | 584 | return -1; |
585 | 585 | ||
586 | memset(&(c->crypto_connections[c->crypto_connections_length]), 0, sizeof(Crypto_Connection)); | 586 | memset(&(c->crypto_connections[c->crypto_connections_length]), 0, sizeof(Crypto_Connection)); |
diff --git a/toxcore/tox.c b/toxcore/tox.c index 80d64626..4fba360b 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c | |||
@@ -379,9 +379,9 @@ void tox_callback_group_invite(void *tox, void (*function)(Messenger *tox, int, | |||
379 | } | 379 | } |
380 | /* Set the callback for group messages. | 380 | /* Set the callback for group messages. |
381 | * | 381 | * |
382 | * Function(Tox *tox, int groupnumber, uint8_t * message, uint16_t length, void *userdata) | 382 | * Function(Tox *tox, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata) |
383 | */ | 383 | */ |
384 | void tox_callback_group_message(void *tox, void (*function)(Messenger *tox, int, uint8_t *, uint16_t, void *), | 384 | void tox_callback_group_message(void *tox, void (*function)(Messenger *tox, int, int, uint8_t *, uint16_t, void *), |
385 | void *userdata) | 385 | void *userdata) |
386 | { | 386 | { |
387 | Messenger *m = tox; | 387 | Messenger *m = tox; |
@@ -407,6 +407,18 @@ int tox_del_groupchat(void *tox, int groupnumber) | |||
407 | Messenger *m = tox; | 407 | Messenger *m = tox; |
408 | return del_groupchat(m, groupnumber); | 408 | return del_groupchat(m, groupnumber); |
409 | } | 409 | } |
410 | |||
411 | /* Copy the name of peernumber who is in groupnumber to name. | ||
412 | * name must be at least MAX_NICK_BYTES long. | ||
413 | * | ||
414 | * return length of name if success | ||
415 | * return -1 if failure | ||
416 | */ | ||
417 | int tox_group_peername(void *tox, int groupnumber, int peernumber, uint8_t *name) | ||
418 | { | ||
419 | Messenger *m = tox; | ||
420 | return m_group_peername(m, groupnumber, peernumber, name); | ||
421 | } | ||
410 | /* invite friendnumber to groupnumber | 422 | /* invite friendnumber to groupnumber |
411 | * return 0 on success | 423 | * return 0 on success |
412 | * return -1 on failure | 424 | * return -1 on failure |
diff --git a/toxcore/tox.h b/toxcore/tox.h index 89242f1f..b39008fe 100644 --- a/toxcore/tox.h +++ b/toxcore/tox.h | |||
@@ -357,9 +357,9 @@ void tox_callback_group_invite(Tox *tox, void (*function)(Tox *tox, int, uint8_t | |||
357 | 357 | ||
358 | /* Set the callback for group messages. | 358 | /* Set the callback for group messages. |
359 | * | 359 | * |
360 | * Function(Tox *tox, int groupnumber, uint8_t * message, uint16_t length, void *userdata) | 360 | * Function(Tox *tox, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata) |
361 | */ | 361 | */ |
362 | void tox_callback_group_message(Tox *tox, void (*function)(Tox *tox, int, uint8_t *, uint16_t, void *), | 362 | void tox_callback_group_message(Tox *tox, void (*function)(Tox *tox, int, int, uint8_t *, uint16_t, void *), |
363 | void *userdata); | 363 | void *userdata); |
364 | 364 | ||
365 | /* Creates a new groupchat and puts it in the chats array. | 365 | /* Creates a new groupchat and puts it in the chats array. |
@@ -376,6 +376,14 @@ int tox_add_groupchat(Tox *tox); | |||
376 | */ | 376 | */ |
377 | int tox_del_groupchat(Tox *tox, int groupnumber); | 377 | int tox_del_groupchat(Tox *tox, int groupnumber); |
378 | 378 | ||
379 | /* Copy the name of peernumber who is in groupnumber to name. | ||
380 | * name must be at least TOX_MAX_NAME_LENGTH long. | ||
381 | * | ||
382 | * return length of name if success | ||
383 | * return -1 if failure | ||
384 | */ | ||
385 | int tox_group_peername(Tox *tox, int groupnumber, int peernumber, uint8_t *name); | ||
386 | |||
379 | /* invite friendnumber to groupnumber | 387 | /* invite friendnumber to groupnumber |
380 | * return 0 on success | 388 | * return 0 on success |
381 | * return -1 on failure | 389 | * return -1 on failure |
diff --git a/toxcore/util.h b/toxcore/util.h index 6937f7d4..9e4ac79a 100644 --- a/toxcore/util.h +++ b/toxcore/util.h | |||
@@ -18,7 +18,7 @@ void id_cpy(uint8_t *dest, uint8_t *src); | |||
18 | 18 | ||
19 | typedef int (*load_state_callback_func)(void *outer, uint8_t *data, uint32_t len, uint16_t type); | 19 | typedef int (*load_state_callback_func)(void *outer, uint8_t *data, uint32_t len, uint16_t type); |
20 | int load_state(load_state_callback_func load_state_callback, void *outer, | 20 | int load_state(load_state_callback_func load_state_callback, void *outer, |
21 | uint8_t *data, uint32_t length, uint16_t cookie_inner); | 21 | uint8_t *data, uint32_t length, uint16_t cookie_inner); |
22 | 22 | ||
23 | #undef LOGGING | 23 | #undef LOGGING |
24 | /* #define LOGGING */ | 24 | /* #define LOGGING */ |