Просмотр исходного кода

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
dzobbe 3 лет назад
Родитель
Сommit
3fad613ea2
1 измененных файлов с 46 добавлено и 13 удалено
  1. 46 13
      core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c

+ 46 - 13
core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c

@@ -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;
+        }
     }
     }
 }
 }