mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Merge branch 'network-test-magic' of https://github.com/roman-yepishev/toxcore
This commit is contained in:
commit
532629d486
|
@ -28,7 +28,7 @@ START_TEST(test_addr_resolv_localhost)
|
||||||
int localhost_split = 0;
|
int localhost_split = 0;
|
||||||
|
|
||||||
IP ip;
|
IP ip;
|
||||||
ip_init(&ip, 0);
|
ip_init(&ip, 0); // ipv6enabled = 0
|
||||||
|
|
||||||
int res = addr_resolve(localhost, &ip, NULL);
|
int res = addr_resolve(localhost, &ip, NULL);
|
||||||
|
|
||||||
|
@ -39,10 +39,10 @@ START_TEST(test_addr_resolv_localhost)
|
||||||
ck_assert_msg(ip.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(ip.ip4.in_addr));
|
ck_assert_msg(ip.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(ip.ip4.in_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
ip_init(&ip, 1);
|
ip_init(&ip, 1); // ipv6enabled = 1
|
||||||
res = addr_resolve(localhost, &ip, NULL);
|
res = addr_resolve(localhost, &ip, NULL);
|
||||||
|
|
||||||
if (res < 1) {
|
if (!(res & TOX_ADDR_RESOLVE_INET6)) {
|
||||||
res = addr_resolve("ip6-localhost", &ip, NULL);
|
res = addr_resolve("ip6-localhost", &ip, NULL);
|
||||||
localhost_split = 1;
|
localhost_split = 1;
|
||||||
}
|
}
|
||||||
|
@ -50,12 +50,12 @@ START_TEST(test_addr_resolv_localhost)
|
||||||
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
|
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
|
||||||
|
|
||||||
if (res > 0) {
|
if (res > 0) {
|
||||||
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6, got %u.", ip.family);
|
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6 (%u), got %u.", AF_INET6, ip.family);
|
||||||
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip));
|
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!localhost_split) {
|
if (!localhost_split) {
|
||||||
ip_init(&ip, 1);
|
ip_init(&ip, 1); // ipv6enabled = 1
|
||||||
ip.family = AF_UNSPEC;
|
ip.family = AF_UNSPEC;
|
||||||
IP extra;
|
IP extra;
|
||||||
ip_reset(&extra);
|
ip_reset(&extra);
|
||||||
|
@ -63,10 +63,10 @@ START_TEST(test_addr_resolv_localhost)
|
||||||
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
|
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
|
||||||
|
|
||||||
if (res > 0) {
|
if (res > 0) {
|
||||||
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6, got %u.", ip.family);
|
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6 (%u), got %u.", AF_INET6, ip.family);
|
||||||
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip));
|
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.", ip_ntoa(&ip));
|
||||||
|
|
||||||
ck_assert_msg(extra.family == AF_INET, "Expected family AF_INET, got %u.", extra.family);
|
ck_assert_msg(extra.family == AF_INET, "Expected family AF_INET (%u), got %u.", AF_INET, extra.family);
|
||||||
ck_assert_msg(extra.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(extra.ip4.in_addr));
|
ck_assert_msg(extra.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(extra.ip4.in_addr));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -144,7 +144,7 @@ Suite *network_suite(void)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main()
|
||||||
{
|
{
|
||||||
srand((unsigned int) time(NULL));
|
srand((unsigned int) time(NULL));
|
||||||
|
|
||||||
|
|
|
@ -939,7 +939,7 @@ int addr_parse_ip(const char *address, IP *to)
|
||||||
* returns in *to a valid IPAny (v4/v6),
|
* returns in *to a valid IPAny (v4/v6),
|
||||||
* prefers v6 if ip.family was AF_UNSPEC and both available
|
* prefers v6 if ip.family was AF_UNSPEC and both available
|
||||||
* returns in *extra an IPv4 address, if family was AF_UNSPEC and *to is AF_INET6
|
* returns in *extra an IPv4 address, if family was AF_UNSPEC and *to is AF_INET6
|
||||||
* returns 0 on failure
|
* returns 0 on failure, TOX_ADDR_RESOLVE_* on success.
|
||||||
*/
|
*/
|
||||||
int addr_resolve(const char *address, IP *to, IP *extra)
|
int addr_resolve(const char *address, IP *to, IP *extra)
|
||||||
{
|
{
|
||||||
|
@ -952,6 +952,8 @@ int addr_resolve(const char *address, IP *to, IP *extra)
|
||||||
struct addrinfo *walker = NULL;
|
struct addrinfo *walker = NULL;
|
||||||
struct addrinfo hints;
|
struct addrinfo hints;
|
||||||
int rc;
|
int rc;
|
||||||
|
int result = 0;
|
||||||
|
int done = 0;
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
hints.ai_family = family;
|
hints.ai_family = family;
|
||||||
|
@ -968,21 +970,22 @@ int addr_resolve(const char *address, IP *to, IP *extra)
|
||||||
}
|
}
|
||||||
|
|
||||||
IP ip4;
|
IP ip4;
|
||||||
ip_init(&ip4, /* ipv6? */ false);
|
ip_init(&ip4, 0); // ipv6enabled = 0
|
||||||
IP ip6;
|
IP ip6;
|
||||||
ip_init(&ip6, /* ipv6? */ true);
|
ip_init(&ip6, 1); // ipv6enabled = 1
|
||||||
|
|
||||||
for (walker = server; (walker != NULL) && (rc != 3); walker = walker->ai_next) {
|
for (walker = server; (walker != NULL) && !done; walker = walker->ai_next) {
|
||||||
switch (walker->ai_family) {
|
switch (walker->ai_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
if (walker->ai_family == family) { /* AF_INET requested, done */
|
if (walker->ai_family == family) { /* AF_INET requested, done */
|
||||||
struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
|
struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
|
||||||
to->ip4.in_addr = addr->sin_addr;
|
to->ip4.in_addr = addr->sin_addr;
|
||||||
rc = 3; // TODO do we really have to reuse variable instead of creating a new one?
|
result = TOX_ADDR_RESOLVE_INET;
|
||||||
} else if (!(rc & 1)) { /* AF_UNSPEC requested, store away */
|
done = 1;
|
||||||
|
} else if (!(result & TOX_ADDR_RESOLVE_INET)) { /* AF_UNSPEC requested, store away */
|
||||||
struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
|
struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
|
||||||
ip4.ip4.in_addr = addr->sin_addr;
|
ip4.ip4.in_addr = addr->sin_addr;
|
||||||
rc |= 1; // FIXME magic number
|
result |= TOX_ADDR_RESOLVE_INET;
|
||||||
}
|
}
|
||||||
|
|
||||||
break; /* switch */
|
break; /* switch */
|
||||||
|
@ -992,13 +995,14 @@ int addr_resolve(const char *address, IP *to, IP *extra)
|
||||||
if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
|
if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
|
||||||
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
|
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
|
||||||
to->ip6.in6_addr = addr->sin6_addr;
|
to->ip6.in6_addr = addr->sin6_addr;
|
||||||
rc = 3;
|
result = TOX_ADDR_RESOLVE_INET6;
|
||||||
|
done = 1;
|
||||||
}
|
}
|
||||||
} else if (!(rc & 2)) { /* AF_UNSPEC requested, store away */
|
} else if (!(result & TOX_ADDR_RESOLVE_INET6)) { /* AF_UNSPEC requested, store away */
|
||||||
if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
|
if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
|
||||||
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
|
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
|
||||||
ip6.ip6.in6_addr = addr->sin6_addr;
|
ip6.ip6.in6_addr = addr->sin6_addr;
|
||||||
rc |= 2;
|
result |= TOX_ADDR_RESOLVE_INET6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1006,21 +1010,22 @@ int addr_resolve(const char *address, IP *to, IP *extra)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (to->family == AF_UNSPEC) {
|
if (family == AF_UNSPEC) {
|
||||||
if (rc & 2) { // FIXME magic number
|
if (result & TOX_ADDR_RESOLVE_INET6) {
|
||||||
ip_copy(to, &ip6);
|
ip_copy(to, &ip6);
|
||||||
|
|
||||||
if ((rc & 1) && (extra != NULL)) {
|
if ((result & TOX_ADDR_RESOLVE_INET) && (extra != NULL)) {
|
||||||
ip_copy(extra, &ip4);
|
ip_copy(extra, &ip4);
|
||||||
}
|
}
|
||||||
} else if (rc & 1) {
|
} else if (result & TOX_ADDR_RESOLVE_INET) {
|
||||||
ip_copy(to, &ip4);
|
ip_copy(to, &ip4);
|
||||||
} else
|
} else {
|
||||||
rc = 0;
|
result = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
freeaddrinfo(server);
|
freeaddrinfo(server);
|
||||||
return rc;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -176,6 +176,10 @@ IP_Port;
|
||||||
|
|
||||||
#define TOX_ENABLE_IPV6_DEFAULT 1
|
#define TOX_ENABLE_IPV6_DEFAULT 1
|
||||||
|
|
||||||
|
/* addr_resolve return values */
|
||||||
|
#define TOX_ADDR_RESOLVE_INET 1
|
||||||
|
#define TOX_ADDR_RESOLVE_INET6 2
|
||||||
|
|
||||||
/* ip_ntoa
|
/* ip_ntoa
|
||||||
* converts ip into a string
|
* converts ip into a string
|
||||||
* uses a static buffer, so mustn't used multiple times in the same output
|
* uses a static buffer, so mustn't used multiple times in the same output
|
||||||
|
|
Loading…
Reference in New Issue
Block a user