@@ -110,21 +110,36 @@ enet_address_set_host (ENetAddress * address, const char * name)
110
110
memset (& hints , 0 , sizeof (hints ));
111
111
hints .ai_family = AF_UNSPEC ;
112
112
113
- if (getaddrinfo (name , NULL , NULL , & resultList ) != 0 )
113
+ if (getaddrinfo (name , NULL , & hints , & resultList ) != 0 )
114
114
return -1 ;
115
115
116
116
for (result = resultList ; result != NULL ; result = result -> ai_next )
117
117
{
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 ))
120
119
{
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 ;
122
123
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 ;
124
128
125
- freeaddrinfo (resultList );
129
+ freeaddrinfo (resultList );
126
130
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
+ }
128
143
}
129
144
}
130
145
0 commit comments