Skip to content

Commit 2b52599

Browse files
committed
Handle IPv4/v6 addresses returend from getaddrinfo
1 parent a91524f commit 2b52599

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

unix.c

+22-7
Original file line numberDiff line numberDiff line change
@@ -110,21 +110,36 @@ enet_address_set_host (ENetAddress * address, const char * name)
110110
memset (& hints, 0, sizeof (hints));
111111
hints.ai_family = AF_UNSPEC;
112112

113-
if (getaddrinfo (name, NULL, NULL, & resultList) != 0)
113+
if (getaddrinfo (name, NULL, & hints, & resultList) != 0)
114114
return -1;
115115

116116
for (result = resultList; result != NULL; result = result -> ai_next)
117117
{
118-
//todo: split 4 with ::ffff: and v6
119-
if (/*result -> ai_family == AF_INET && */ result -> ai_addr != NULL && result -> ai_addrlen >= sizeof (struct sockaddr_in))
118+
if (result -> ai_addr != NULL && result -> ai_addrlen >= sizeof (struct sockaddr_in))
120119
{
121-
struct sockaddr_in6 * sin = (struct sockaddr_in6 *) result -> ai_addr;
120+
if (result -> ai_family == AF_INET)
121+
{
122+
struct sockaddr_in * sin = (struct sockaddr_in *) result -> ai_addr;
122123

123-
address -> host = sin -> sin6_addr;
124+
((uint32_t *) & address -> host.s6_addr)[0] = 0;
125+
((uint32_t *) & address -> host.s6_addr)[1] = 0;
126+
((uint32_t *) & address -> host.s6_addr)[2] = htonl(0xffff);
127+
((uint32_t *) & address -> host.s6_addr)[3] = sin->sin_addr.s_addr;
124128

125-
freeaddrinfo (resultList);
129+
freeaddrinfo (resultList);
126130

127-
return 0;
131+
return 0;
132+
}
133+
else if(result -> ai_family == AF_INET6)
134+
{
135+
struct sockaddr_in6 * sin = (struct sockaddr_in6 *) result -> ai_addr;
136+
137+
address -> host = sin -> sin6_addr;
138+
139+
freeaddrinfo (resultList);
140+
141+
return 0;
142+
}
128143
}
129144
}
130145

0 commit comments

Comments
 (0)