33#include <netdb.h>
44#include <stdlib.h>
55#include <string.h>
6+ #include <wasi/file_utils.h>
67#include <wasi/sockets_utils.h>
78
89#ifdef __wasip1__
910static_assert (SOCK_DGRAM == __WASI_FILETYPE_SOCKET_DGRAM , "value mismatch" );
1011static_assert (SOCK_STREAM == __WASI_FILETYPE_SOCKET_STREAM , "value mismatch" );
1112#endif
1213
14+ #ifdef __wasip2__
15+ #define IP_NAME_LOOKUP_ERROR_CODE_NAME_UNRESOLVABLE \
16+ NETWORK_ERROR_CODE_NAME_UNRESOLVABLE
17+ #define IP_NAME_LOOKUP_ERROR_CODE_TEMPORARY_RESOLVER_FAILURE \
18+ NETWORK_ERROR_CODE_TEMPORARY_RESOLVER_FAILURE
19+ #define IP_NAME_LOOKUP_ERROR_CODE_PERMANENT_RESOLVER_FAILURE \
20+ NETWORK_ERROR_CODE_PERMANENT_RESOLVER_FAILURE
21+ #endif
22+
1323_Thread_local int h_errno = 0 ;
1424
1525static struct servent global_serv = {0 };
1626
1727static int map_error (ip_name_lookup_error_code_t error ) {
1828 switch (error ) {
29+ #ifdef __wasip2__
1930 case NETWORK_ERROR_CODE_OUT_OF_MEMORY :
2031 return EAI_MEMORY ;
21- case NETWORK_ERROR_CODE_NAME_UNRESOLVABLE :
32+ #endif
33+ case IP_NAME_LOOKUP_ERROR_CODE_NAME_UNRESOLVABLE :
2234 return EAI_NONAME ;
23- case NETWORK_ERROR_CODE_TEMPORARY_RESOLVER_FAILURE :
35+ case IP_NAME_LOOKUP_ERROR_CODE_TEMPORARY_RESOLVER_FAILURE :
2436 return EAI_AGAIN ;
25- case NETWORK_ERROR_CODE_PERMANENT_RESOLVER_FAILURE :
37+ case IP_NAME_LOOKUP_ERROR_CODE_PERMANENT_RESOLVER_FAILURE :
2638 return EAI_FAIL ;
39+ #ifdef __wasip3__
40+ case IP_NAME_LOOKUP_ERROR_CODE_UNKNOWN :
41+ errno = EIO ;
42+ return EAI_SYSTEM ;
43+ case IP_NAME_LOOKUP_ERROR_CODE_ACCESS_DENIED :
44+ errno = EACCES ;
45+ return EAI_SYSTEM ;
46+ case IP_NAME_LOOKUP_ERROR_CODE_INVALID_ARGUMENT :
47+ errno = EINVAL ;
48+ return EAI_SYSTEM ;
49+ #endif
2750
2851 default :
52+ #ifdef __wasip2__
2953 __wasilibc_socket_error_to_errno (error );
54+ #endif
3055 return EAI_SYSTEM ;
3156 }
3257}
3358
34- static int add_addr (ip_name_lookup_option_ip_address_t address , in_port_t port ,
35- int socktype , const struct addrinfo * restrict hint ,
59+ static int add_addr (sockets_ip_address_t address , in_port_t port , int socktype ,
60+ const struct addrinfo * restrict hint ,
3661 struct addrinfo * * restrict current ,
3762 struct addrinfo * * restrict res ) {
3863 int family ;
3964 struct sockaddr * addr ;
4065 socklen_t addrlen ;
41- switch (address .val . tag ) {
42- case NETWORK_IP_ADDRESS_IPV4 : {
66+ switch (address .tag ) {
67+ case SOCKETS_IP_ADDRESS_IPV4 : {
4368 if (hint && hint -> ai_family != AF_UNSPEC && hint -> ai_family != AF_INET ) {
4469 return 0 ;
4570 }
4671
47- network_ipv4_address_t ip = address . val .val .ipv4 ;
72+ sockets_ipv4_address_t ip = address .val .ipv4 ;
4873
4974 family = PF_INET ;
5075 addrlen = sizeof (struct sockaddr_in );
@@ -63,12 +88,12 @@ static int add_addr(ip_name_lookup_option_ip_address_t address, in_port_t port,
6388 memcpy (addr , & sockaddr , addrlen );
6489 break ;
6590 }
66- case NETWORK_IP_ADDRESS_IPV6 : {
91+ case SOCKETS_IP_ADDRESS_IPV6 : {
6792 if (hint && hint -> ai_family != AF_UNSPEC && hint -> ai_family != AF_INET6 ) {
6893 return 0 ;
6994 }
7095
71- network_ipv6_address_t ip = address . val .val .ipv6 ;
96+ sockets_ipv6_address_t ip = address .val .ipv6 ;
7297
7398 family = PF_INET6 ;
7499 addrlen = sizeof (struct sockaddr_in6 );
@@ -171,16 +196,25 @@ int getaddrinfo(const char *restrict host, const char *restrict serv,
171196
172197 * res = NULL ;
173198 struct addrinfo * current = NULL ;
174- wasip2_string_t name = {.ptr = (uint8_t * )host , .len = strlen (host )};
175- ip_name_lookup_own_resolve_address_stream_t stream ;
199+ wasi_string_t name = {.ptr = (uint8_t * )host , .len = strlen (host )};
176200 ip_name_lookup_error_code_t error ;
201+ #ifdef __wasip2__
202+ ip_name_lookup_own_resolve_address_stream_t stream ;
177203 if (!ip_name_lookup_resolve_addresses (__wasi_sockets_utils__borrow_network (),
178204 & name , & stream , & error ))
179205 return map_error (error );
180-
181- int ret = 0 ;
182206 ip_name_lookup_borrow_resolve_address_stream_t stream_borrow =
183207 ip_name_lookup_borrow_resolve_address_stream (stream );
208+ poll_own_pollable_t pollable ;
209+ pollable .__handle = 0 ;
210+ #else
211+ ip_name_lookup_list_ip_address_t addresses ;
212+ if (!ip_name_lookup_resolve_addresses (& name , & addresses , & error ))
213+ return map_error (error );
214+ size_t next = 0 ;
215+ #endif
216+
217+ int ret = 0 ;
184218 // The 'serv' parameter can be either a port number or a service name.
185219 int port = 0 ;
186220 uint16_t protocol = SERVICE_PROTOCOL_TCP ;
@@ -198,13 +232,11 @@ int getaddrinfo(const char *restrict host, const char *restrict serv,
198232 }
199233 }
200234
201- poll_own_pollable_t pollable ;
202- pollable .__handle = 0 ;
203-
204235 while (ret == 0 ) {
205- ip_name_lookup_option_ip_address_t address ;
236+ #ifdef __wasip2__
237+ ip_name_lookup_option_ip_address_t maybe_address ;
206238 if (!ip_name_lookup_method_resolve_address_stream_resolve_next_address (
207- stream_borrow , & address , & error )) {
239+ stream_borrow , & maybe_address , & error )) {
208240 if (error != NETWORK_ERROR_CODE_WOULD_BLOCK ) {
209241 freeaddrinfo (* res );
210242 ret = map_error (error );
@@ -218,8 +250,15 @@ int getaddrinfo(const char *restrict host, const char *restrict serv,
218250 poll_method_pollable_block (poll_borrow_pollable (pollable ));
219251 continue ;
220252 }
221- if (!address .is_some )
253+ if (!maybe_address .is_some )
254+ break ;
255+ sockets_ip_address_t address = maybe_address .val ;
256+
257+ #else
258+ if (next == addresses .len )
222259 break ;
260+ sockets_ip_address_t address = addresses .ptr [next ++ ];
261+ #endif
223262 if (protocol & SERVICE_PROTOCOL_TCP ) {
224263 ret = add_addr (address , htons (port ), SOCK_STREAM , hint , & current , res );
225264 if (ret )
@@ -232,9 +271,13 @@ int getaddrinfo(const char *restrict host, const char *restrict serv,
232271 }
233272 }
234273
274+ #ifdef __wasip2__
235275 if (pollable .__handle != 0 )
236276 poll_pollable_drop_own (pollable );
237277 ip_name_lookup_resolve_address_stream_drop_own (stream );
278+ #else
279+ ip_name_lookup_list_ip_address_free (& addresses );
280+ #endif
238281 return ret ;
239282}
240283
0 commit comments