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 <errno.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <wasi/api.h>
#include <wasi_socket_ext.h>
@ -136,10 +136,12 @@ wasi_addr_to_sockaddr(const __wasi_addr_t *wasi_addr,
int
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_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = __wasi_sock_accept(sockfd, 0, &new_sockfd);
HANDLE_ERROR(error)
@ -152,9 +154,11 @@ accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
int
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;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = sockaddr_to_wasi_addr(addr, addrlen, &wasi_addr);
HANDLE_ERROR(error)
@ -167,9 +171,11 @@ bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
int
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;
memset(&wasi_addr, 0, sizeof(wasi_addr));
if (NULL == addr) {
HANDLE_ERROR(__WASI_ERRNO_INVAL)
}
@ -210,12 +216,13 @@ recvmsg(int sockfd, struct msghdr *msg, int flags)
}
// __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)
}
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;
}
@ -246,12 +253,13 @@ sendmsg(int sockfd, const struct msghdr *msg, int flags)
}
// 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)
}
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;
}
@ -269,7 +277,7 @@ sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen)
{
// 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;
__wasi_addr_t wasi_addr;
__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)
{
// 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;
__wasi_addr_t wasi_addr;
__wasi_errno_t error;
@ -363,9 +371,11 @@ socket(int domain, int type, int protocol)
int
getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
__wasi_addr_t wasi_addr = { 0 };
__wasi_addr_t wasi_addr;
__wasi_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = __wasi_sock_addr_local(sockfd, &wasi_addr);
HANDLE_ERROR(error)
@ -378,9 +388,11 @@ getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
int
getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
__wasi_addr_t wasi_addr = { 0 };
__wasi_addr_t wasi_addr;
__wasi_errno_t error;
memset(&wasi_addr, 0, sizeof(wasi_addr));
error = __wasi_sock_addr_remote(sockfd, &wasi_addr);
HANDLE_ERROR(error)
@ -504,7 +516,8 @@ getaddrinfo(const char *node, const char *service, const struct addrinfo *hints,
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) {
free(addr_info);
HANDLE_ERROR(__WASI_ERRNO_NOMEM)
@ -750,59 +763,79 @@ set_sol_socket_option(int sockfd, int optname, const void *optval,
switch (optname) {
case SO_RCVTIMEO:
{
assert(optlen == sizeof(struct timeval));
timeout_us = timeval_to_time_us(*(struct timeval *)optval);
error = __wasi_sock_set_recv_timeout(sockfd, timeout_us);
HANDLE_ERROR(error);
return error;
}
case SO_SNDTIMEO:
{
assert(optlen == sizeof(struct timeval));
timeout_us = timeval_to_time_us(*(struct timeval *)optval);
error = __wasi_sock_set_send_timeout(sockfd, timeout_us);
HANDLE_ERROR(error);
return error;
}
case SO_SNDBUF:
{
assert(optlen == sizeof(int));
error = __wasi_sock_set_send_buf_size(sockfd, *(size_t *)optval);
HANDLE_ERROR(error);
return error;
}
case SO_RCVBUF:
{
assert(optlen == sizeof(int));
error = __wasi_sock_set_recv_buf_size(sockfd, *(size_t *)optval);
HANDLE_ERROR(error);
return error;
}
case SO_KEEPALIVE:
{
assert(optlen == sizeof(int));
error = __wasi_sock_set_keep_alive(sockfd, *(bool *)optval);
HANDLE_ERROR(error);
return error;
}
case SO_REUSEADDR:
{
assert(optlen == sizeof(int));
error = __wasi_sock_set_reuse_addr(sockfd, *(bool *)optval);
HANDLE_ERROR(error);
return error;
}
case SO_REUSEPORT:
{
assert(optlen == sizeof(int));
error = __wasi_sock_set_reuse_port(sockfd, *(bool *)optval);
HANDLE_ERROR(error);
return error;
}
case SO_LINGER:
{
assert(optlen == sizeof(struct linger));
struct linger *linger_opt = ((struct linger *)optval);
error = __wasi_sock_set_linger(sockfd, (bool)linger_opt->l_onoff,
linger_opt->l_linger);
HANDLE_ERROR(error);
return error;
}
case SO_BROADCAST:
{
assert(optlen == sizeof(int));
error = __wasi_sock_set_broadcast(sockfd, *(bool *)optval);
HANDLE_ERROR(error);
return error;
}
default:
{
error = __WASI_ERRNO_NOTSUP;
HANDLE_ERROR(error);
return error;
}
}
}
int