summaryrefslogtreecommitdiff
path: root/toxcore/network.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/network.c')
-rw-r--r--toxcore/network.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/toxcore/network.c b/toxcore/network.c
index 04efd03b..5ab480b7 100644
--- a/toxcore/network.c
+++ b/toxcore/network.c
@@ -939,7 +939,7 @@ int addr_parse_ip(const char *address, IP *to)
939 * returns in *to a valid IPAny (v4/v6), 939 * returns in *to a valid IPAny (v4/v6),
940 * prefers v6 if ip.family was AF_UNSPEC and both available 940 * prefers v6 if ip.family was AF_UNSPEC and both available
941 * returns in *extra an IPv4 address, if family was AF_UNSPEC and *to is AF_INET6 941 * returns in *extra an IPv4 address, if family was AF_UNSPEC and *to is AF_INET6
942 * returns 0 on failure 942 * returns 0 on failure, TOX_ADDR_RESOLVE_* on success.
943 */ 943 */
944int addr_resolve(const char *address, IP *to, IP *extra) 944int addr_resolve(const char *address, IP *to, IP *extra)
945{ 945{
@@ -951,7 +951,9 @@ int addr_resolve(const char *address, IP *to, IP *extra)
951 struct addrinfo *server = NULL; 951 struct addrinfo *server = NULL;
952 struct addrinfo *walker = NULL; 952 struct addrinfo *walker = NULL;
953 struct addrinfo hints; 953 struct addrinfo hints;
954 int rc; 954 int rc;
955 int result = 0;
956 int done = 0;
955 957
956 memset(&hints, 0, sizeof(hints)); 958 memset(&hints, 0, sizeof(hints));
957 hints.ai_family = family; 959 hints.ai_family = family;
@@ -972,17 +974,18 @@ int addr_resolve(const char *address, IP *to, IP *extra)
972 IP ip6; 974 IP ip6;
973 ip_init(&ip6, /* ipv6? */ true); 975 ip_init(&ip6, /* ipv6? */ true);
974 976
975 for (walker = server; (walker != NULL) && (rc != 3); walker = walker->ai_next) { 977 for (walker = server; (walker != NULL) && !done; walker = walker->ai_next) {
976 switch (walker->ai_family) { 978 switch (walker->ai_family) {
977 case AF_INET: 979 case AF_INET:
978 if (walker->ai_family == family) { /* AF_INET requested, done */ 980 if (walker->ai_family == family) { /* AF_INET requested, done */
979 struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr; 981 struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
980 to->ip4.in_addr = addr->sin_addr; 982 to->ip4.in_addr = addr->sin_addr;
981 rc = 3; // TODO do we really have to reuse variable instead of creating a new one? 983 result = TOX_ADDR_RESOLVE_INET;
982 } else if (!(rc & 1)) { /* AF_UNSPEC requested, store away */ 984 done = 1;
985 } else if (!(result & TOX_ADDR_RESOLVE_INET)) { /* AF_UNSPEC requested, store away */
983 struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr; 986 struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr;
984 ip4.ip4.in_addr = addr->sin_addr; 987 ip4.ip4.in_addr = addr->sin_addr;
985 rc |= 1; // FIXME magic number 988 result |= TOX_ADDR_RESOLVE_INET;
986 } 989 }
987 990
988 break; /* switch */ 991 break; /* switch */
@@ -992,13 +995,14 @@ int addr_resolve(const char *address, IP *to, IP *extra)
992 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) { 995 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
993 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr; 996 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
994 to->ip6.in6_addr = addr->sin6_addr; 997 to->ip6.in6_addr = addr->sin6_addr;
995 rc = 3; 998 result = TOX_ADDR_RESOLVE_INET6;
999 done = 1;
996 } 1000 }
997 } else if (!(rc & 2)) { /* AF_UNSPEC requested, store away */ 1001 } else if (!(result & TOX_ADDR_RESOLVE_INET6)) { /* AF_UNSPEC requested, store away */
998 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) { 1002 if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) {
999 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr; 1003 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr;
1000 ip6.ip6.in6_addr = addr->sin6_addr; 1004 ip6.ip6.in6_addr = addr->sin6_addr;
1001 rc |= 2; 1005 result |= TOX_ADDR_RESOLVE_INET6;
1002 } 1006 }
1003 } 1007 }
1004 1008
@@ -1006,21 +1010,22 @@ int addr_resolve(const char *address, IP *to, IP *extra)
1006 } 1010 }
1007 } 1011 }
1008 1012
1009 if (to->family == AF_UNSPEC) { 1013 if (family == AF_UNSPEC) {
1010 if (rc & 2) { // FIXME magic number 1014 if (result & TOX_ADDR_RESOLVE_INET6) {
1011 ip_copy(to, &ip6); 1015 ip_copy(to, &ip6);
1012 1016
1013 if ((rc & 1) && (extra != NULL)) { 1017 if ((result & TOX_ADDR_RESOLVE_INET) && (extra != NULL)) {
1014 ip_copy(extra, &ip4); 1018 ip_copy(extra, &ip4);
1015 } 1019 }
1016 } else if (rc & 1) { 1020 } else if (result & TOX_ADDR_RESOLVE_INET) {
1017 ip_copy(to, &ip4); 1021 ip_copy(to, &ip4);
1018 } else 1022 } else {
1019 rc = 0; 1023 result = 0;
1024 }
1020 } 1025 }
1021 1026
1022 freeaddrinfo(server); 1027 freeaddrinfo(server);
1023 return rc; 1028 return result;
1024} 1029}
1025 1030
1026/* 1031/*