diff --git a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c index 79a594163..a27220867 100644 --- a/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c +++ b/core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c @@ -6,8 +6,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -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; + } } }