88#include <wasi/udp.h>
99#include <wasi/wasip2.h>
1010
11- #ifdef __wasip2__
12-
1311// Pollables here are lazily initialized as-needed.
1412typedef struct {
13+ #if defined(__wasip2__ )
1514 udp_own_incoming_datagram_stream_t incoming ;
1615 poll_own_pollable_t incoming_pollable ;
1716 udp_own_outgoing_datagram_stream_t outgoing ;
1817 poll_own_pollable_t outgoing_pollable ;
18+ #elif defined(__wasip3__ )
19+ int dummy ;
20+ #else
21+ #error "Unsupported WASI version"
22+ #endif
1923} udp_socket_streams_t ;
2024
2125typedef struct {
@@ -55,22 +59,24 @@ typedef struct {
5559} udp_socket_state_t ;
5660
5761typedef struct {
58- udp_own_udp_socket_t socket ;
62+ sockets_own_udp_socket_t socket ;
63+ #ifdef __wasip2__
5964 // Lazily initialized as-needed pollable.
6065 poll_own_pollable_t socket_pollable ;
66+ #endif
6167 bool blocking ;
62- network_ip_address_family_t family ;
68+ sockets_ip_address_family_t family ;
6369 udp_socket_state_t state ;
6470} udp_socket_t ;
6571
6672static descriptor_vtable_t udp_vtable ;
6773
68- int __wasilibc_add_udp_socket (udp_own_udp_socket_t socket ,
69- network_ip_address_family_t family ,
74+ int __wasilibc_add_udp_socket (sockets_own_udp_socket_t socket ,
75+ sockets_ip_address_family_t family ,
7076 bool blocking ) {
7177 udp_socket_t * udp = calloc (1 , sizeof (udp_socket_t ));
7278 if (!udp ) {
73- udp_udp_socket_drop_own (socket );
79+ sockets_udp_socket_drop_own (socket );
7480 errno = ENOMEM ;
7581 return -1 ;
7682 }
@@ -86,7 +92,7 @@ int __wasilibc_add_udp_socket(udp_own_udp_socket_t socket,
8692}
8793
8894static int udp_create_streams (udp_socket_t * socket ,
89- network_ip_socket_address_t * remote_address ) {
95+ sockets_ip_socket_address_t * remote_address ) {
9096 // Assert that:
9197 // - We're already bound. This is required by WASI.
9298 // - We have no active streams. From WASI:
@@ -96,7 +102,8 @@ static int udp_create_streams(udp_socket_t *socket,
96102 abort ();
97103 }
98104
99- udp_borrow_udp_socket_t socket_borrow = udp_borrow_udp_socket (socket -> socket );
105+ sockets_borrow_udp_socket_t socket_borrow =
106+ sockets_borrow_udp_socket (socket -> socket );
100107
101108 udp_socket_streams_t * dst ;
102109 if (remote_address != NULL ) {
@@ -107,7 +114,8 @@ static int udp_create_streams(udp_socket_t *socket,
107114
108115 memset (dst , 0 , sizeof (* dst ));
109116
110- network_error_code_t error ;
117+ sockets_error_code_t error ;
118+ #ifdef __wasip2__
111119 udp_tuple2_own_incoming_datagram_stream_own_outgoing_datagram_stream_t io ;
112120 if (!udp_method_udp_socket_stream (socket_borrow , remote_address , & io , & error ))
113121 return __wasilibc_socket_error_to_errno (error );
@@ -121,16 +129,22 @@ static int udp_create_streams(udp_socket_t *socket,
121129 socket -> state .tag = UDP_SOCKET_STATE_BOUND_STREAMING ;
122130 }
123131
124- return true;
132+ return 0 ;
133+ #else
134+ errno = ENOTSUP ;
135+ return -1 ;
136+ #endif
125137}
126138
127139static void udp_close_streams (udp_socket_streams_t * streams ) {
140+ #ifdef __wasip2__
128141 if (streams -> incoming_pollable .__handle != 0 )
129142 poll_pollable_drop_own (streams -> incoming_pollable );
130143 udp_incoming_datagram_stream_drop_own (streams -> incoming );
131144 if (streams -> outgoing_pollable .__handle != 0 )
132145 poll_pollable_drop_own (streams -> outgoing_pollable );
133146 udp_outgoing_datagram_stream_drop_own (streams -> outgoing );
147+ #endif
134148}
135149
136150static void udp_free (void * data ) {
@@ -147,9 +161,11 @@ static void udp_free(void *data) {
147161 break ;
148162 }
149163
164+ #ifdef __wasip2__
150165 if (udp -> socket_pollable .__handle != 0 )
151166 poll_pollable_drop_own (udp -> socket_pollable );
152- udp_udp_socket_drop_own (udp -> socket );
167+ #endif
168+ sockets_udp_socket_drop_own (udp -> socket );
153169
154170 free (udp );
155171}
@@ -167,6 +183,7 @@ static int udp_fstat(void *data, struct stat *buf) {
167183 return 0 ;
168184}
169185
186+ #ifdef __wasip2__
170187static poll_borrow_pollable_t udp_pollable (udp_socket_t * socket ) {
171188 if (socket -> socket_pollable .__handle == 0 ) {
172189 udp_borrow_udp_socket_t socket_borrow =
@@ -194,7 +211,7 @@ udp_outgoing_pollable(udp_socket_streams_t *streams) {
194211 return poll_borrow_pollable (streams -> outgoing_pollable );
195212}
196213
197- static int udp_handle_error (udp_socket_t * socket , network_error_code_t error ) {
214+ static int udp_handle_error (udp_socket_t * socket , sockets_error_code_t error ) {
198215 if (error == NETWORK_ERROR_CODE_WOULD_BLOCK && socket -> blocking ) {
199216 poll_method_pollable_block (udp_pollable (socket ));
200217 } else {
@@ -205,13 +222,13 @@ static int udp_handle_error(udp_socket_t *socket, network_error_code_t error) {
205222}
206223
207224static int udp_do_bind (udp_socket_t * socket ,
208- network_ip_socket_address_t * address ) {
225+ sockets_ip_socket_address_t * address ) {
209226 if (socket -> state .tag != UDP_SOCKET_STATE_UNBOUND ) {
210227 errno = EINVAL ;
211228 return -1 ;
212229 }
213230
214- network_error_code_t error ;
231+ sockets_error_code_t error ;
215232 network_borrow_network_t network_borrow =
216233 __wasi_sockets_utils__borrow_network ();
217234 udp_borrow_udp_socket_t socket_borrow = udp_borrow_udp_socket (socket -> socket );
@@ -838,13 +855,15 @@ static int udp_fcntl_setfl(void *data, int flags) {
838855 }
839856 return 0 ;
840857}
858+ #endif
841859
842860static descriptor_vtable_t udp_vtable = {
843861 .free = udp_free ,
844862
845863 .set_blocking = udp_set_blocking ,
846864 .fstat = udp_fstat ,
847865
866+ #ifdef __wasip2__
848867 .bind = udp_bind ,
849868 .connect = udp_connect ,
850869 .getsockname = udp_getsockname ,
@@ -858,6 +877,5 @@ static descriptor_vtable_t udp_vtable = {
858877
859878 .fcntl_getfl = udp_fcntl_getfl ,
860879 .fcntl_setfl = udp_fcntl_setfl ,
880+ #endif
861881};
862-
863- #endif // __wasip2__
0 commit comments