Enable build wasi_socket_ext.c with both clang and clang++ (#1527)

Enable to run WolfSSL into wasm and need some features from C++:
https://github.com/JamesMenetrey/wolfssl-examples/tree/wasm/Wasm
This commit is contained in:
dzobbe 2022-09-29 14:52:11 +02:00 committed by GitHub
parent dc2c6c75f5
commit 3fad613ea2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,8 +6,8 @@
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <wasi/api.h> #include <wasi/api.h>
#include <wasi_socket_ext.h> #include <wasi_socket_ext.h>
@ -136,10 +136,12 @@ wasi_addr_to_sockaddr(const __wasi_addr_t *wasi_addr,
int int
accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{ {
__wasi_addr_t wasi_addr = { 0 }; __wasi_addr_t wasi_addr;
__wasi_fd_t new_sockfd; __wasi_fd_t new_sockfd;
__wasi_errno_t error; __wasi_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = __wasi_sock_accept(sockfd, 0, &new_sockfd); error = __wasi_sock_accept(sockfd, 0, &new_sockfd);
HANDLE_ERROR(error) HANDLE_ERROR(error)
@ -152,9 +154,11 @@ accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
int int
bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{ {
__wasi_addr_t wasi_addr = { 0 }; __wasi_addr_t wasi_addr;
__wasi_errno_t error; __wasi_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = sockaddr_to_wasi_addr(addr, addrlen, &wasi_addr); error = sockaddr_to_wasi_addr(addr, addrlen, &wasi_addr);
HANDLE_ERROR(error) HANDLE_ERROR(error)
@ -167,9 +171,11 @@ bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
int int
connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{ {
__wasi_addr_t wasi_addr = { 0 }; __wasi_addr_t wasi_addr;
__wasi_errno_t error; __wasi_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
if (NULL == addr) { if (NULL == addr) {
HANDLE_ERROR(__WASI_ERRNO_INVAL) HANDLE_ERROR(__WASI_ERRNO_INVAL)
} }
@ -210,12 +216,13 @@ recvmsg(int sockfd, struct msghdr *msg, int flags)
} }
// __wasi_ciovec_t -> struct iovec // __wasi_ciovec_t -> struct iovec
if (!(ri_data = malloc(sizeof(__wasi_iovec_t) * msg->msg_iovlen))) { if (!(ri_data = (__wasi_iovec_t *)malloc(sizeof(__wasi_iovec_t)
* msg->msg_iovlen))) {
HANDLE_ERROR(__WASI_ERRNO_NOMEM) HANDLE_ERROR(__WASI_ERRNO_NOMEM)
} }
for (i = 0; i < msg->msg_iovlen; i++) { for (i = 0; i < msg->msg_iovlen; i++) {
ri_data[i].buf = msg->msg_iov[i].iov_base; ri_data[i].buf = (uint8_t *)msg->msg_iov[i].iov_base;
ri_data[i].buf_len = msg->msg_iov[i].iov_len; ri_data[i].buf_len = msg->msg_iov[i].iov_len;
} }
@ -246,12 +253,13 @@ sendmsg(int sockfd, const struct msghdr *msg, int flags)
} }
// struct iovec -> __wasi_ciovec_t // struct iovec -> __wasi_ciovec_t
if (!(si_data = malloc(sizeof(__wasi_ciovec_t) * msg->msg_iovlen))) { if (!(si_data = (__wasi_ciovec_t *)malloc(sizeof(__wasi_ciovec_t)
* msg->msg_iovlen))) {
HANDLE_ERROR(__WASI_ERRNO_NOMEM) HANDLE_ERROR(__WASI_ERRNO_NOMEM)
} }
for (i = 0; i < msg->msg_iovlen; i++) { for (i = 0; i < msg->msg_iovlen; i++) {
si_data[i].buf = msg->msg_iov[i].iov_base; si_data[i].buf = (uint8_t *)msg->msg_iov[i].iov_base;
si_data[i].buf_len = msg->msg_iov[i].iov_len; si_data[i].buf_len = msg->msg_iov[i].iov_len;
} }
@ -269,7 +277,7 @@ sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen) const struct sockaddr *dest_addr, socklen_t addrlen)
{ {
// Prepare input parameters. // Prepare input parameters.
__wasi_ciovec_t iov = { .buf = buf, .buf_len = len }; __wasi_ciovec_t iov = { .buf = (uint8_t *)buf, .buf_len = len };
uint32_t so_datalen = 0; uint32_t so_datalen = 0;
__wasi_addr_t wasi_addr; __wasi_addr_t wasi_addr;
__wasi_errno_t error; __wasi_errno_t error;
@ -297,7 +305,7 @@ recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen) struct sockaddr *src_addr, socklen_t *addrlen)
{ {
// Prepare input parameters. // Prepare input parameters.
__wasi_ciovec_t iov = { .buf = buf, .buf_len = len }; __wasi_ciovec_t iov = { .buf = (uint8_t *)buf, .buf_len = len };
uint32_t so_datalen = 0; uint32_t so_datalen = 0;
__wasi_addr_t wasi_addr; __wasi_addr_t wasi_addr;
__wasi_errno_t error; __wasi_errno_t error;
@ -363,9 +371,11 @@ socket(int domain, int type, int protocol)
int int
getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen) getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{ {
__wasi_addr_t wasi_addr = { 0 }; __wasi_addr_t wasi_addr;
__wasi_errno_t error; __wasi_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = __wasi_sock_addr_local(sockfd, &wasi_addr); error = __wasi_sock_addr_local(sockfd, &wasi_addr);
HANDLE_ERROR(error) HANDLE_ERROR(error)
@ -378,9 +388,11 @@ getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
int int
getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen) getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{ {
__wasi_addr_t wasi_addr = { 0 }; __wasi_addr_t wasi_addr;
__wasi_errno_t error; __wasi_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = __wasi_sock_addr_remote(sockfd, &wasi_addr); error = __wasi_sock_addr_remote(sockfd, &wasi_addr);
HANDLE_ERROR(error) HANDLE_ERROR(error)
@ -504,7 +516,8 @@ getaddrinfo(const char *node, const char *service, const struct addrinfo *hints,
return __WASI_ERRNO_SUCCESS; return __WASI_ERRNO_SUCCESS;
} }
aibuf_res = calloc(1, addr_info_size * sizeof(struct aibuf)); aibuf_res =
(struct aibuf *)calloc(1, addr_info_size * sizeof(struct aibuf));
if (!aibuf_res) { if (!aibuf_res) {
free(addr_info); free(addr_info);
HANDLE_ERROR(__WASI_ERRNO_NOMEM) HANDLE_ERROR(__WASI_ERRNO_NOMEM)
@ -750,58 +763,78 @@ set_sol_socket_option(int sockfd, int optname, const void *optval,
switch (optname) { switch (optname) {
case SO_RCVTIMEO: case SO_RCVTIMEO:
{
assert(optlen == sizeof(struct timeval)); assert(optlen == sizeof(struct timeval));
timeout_us = timeval_to_time_us(*(struct timeval *)optval); timeout_us = timeval_to_time_us(*(struct timeval *)optval);
error = __wasi_sock_set_recv_timeout(sockfd, timeout_us); error = __wasi_sock_set_recv_timeout(sockfd, timeout_us);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_SNDTIMEO: case SO_SNDTIMEO:
{
assert(optlen == sizeof(struct timeval)); assert(optlen == sizeof(struct timeval));
timeout_us = timeval_to_time_us(*(struct timeval *)optval); timeout_us = timeval_to_time_us(*(struct timeval *)optval);
error = __wasi_sock_set_send_timeout(sockfd, timeout_us); error = __wasi_sock_set_send_timeout(sockfd, timeout_us);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_SNDBUF: case SO_SNDBUF:
{
assert(optlen == sizeof(int)); assert(optlen == sizeof(int));
error = __wasi_sock_set_send_buf_size(sockfd, *(size_t *)optval); error = __wasi_sock_set_send_buf_size(sockfd, *(size_t *)optval);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_RCVBUF: case SO_RCVBUF:
{
assert(optlen == sizeof(int)); assert(optlen == sizeof(int));
error = __wasi_sock_set_recv_buf_size(sockfd, *(size_t *)optval); error = __wasi_sock_set_recv_buf_size(sockfd, *(size_t *)optval);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_KEEPALIVE: case SO_KEEPALIVE:
{
assert(optlen == sizeof(int)); assert(optlen == sizeof(int));
error = __wasi_sock_set_keep_alive(sockfd, *(bool *)optval); error = __wasi_sock_set_keep_alive(sockfd, *(bool *)optval);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_REUSEADDR: case SO_REUSEADDR:
{
assert(optlen == sizeof(int)); assert(optlen == sizeof(int));
error = __wasi_sock_set_reuse_addr(sockfd, *(bool *)optval); error = __wasi_sock_set_reuse_addr(sockfd, *(bool *)optval);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_REUSEPORT: case SO_REUSEPORT:
{
assert(optlen == sizeof(int)); assert(optlen == sizeof(int));
error = __wasi_sock_set_reuse_port(sockfd, *(bool *)optval); error = __wasi_sock_set_reuse_port(sockfd, *(bool *)optval);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_LINGER: case SO_LINGER:
{
assert(optlen == sizeof(struct linger)); assert(optlen == sizeof(struct linger));
struct linger *linger_opt = ((struct linger *)optval); struct linger *linger_opt = ((struct linger *)optval);
error = __wasi_sock_set_linger(sockfd, (bool)linger_opt->l_onoff, error = __wasi_sock_set_linger(sockfd, (bool)linger_opt->l_onoff,
linger_opt->l_linger); linger_opt->l_linger);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
case SO_BROADCAST: case SO_BROADCAST:
{
assert(optlen == sizeof(int)); assert(optlen == sizeof(int));
error = __wasi_sock_set_broadcast(sockfd, *(bool *)optval); error = __wasi_sock_set_broadcast(sockfd, *(bool *)optval);
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
default: default:
{
error = __WASI_ERRNO_NOTSUP; error = __WASI_ERRNO_NOTSUP;
HANDLE_ERROR(error); HANDLE_ERROR(error);
return error; return error;
}
} }
} }