mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 23:15:16 +00:00
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:
parent
dc2c6c75f5
commit
3fad613ea2
|
@ -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,58 +763,78 @@ 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user