Skip to content

Commit

Permalink
manually transfer struct sockaddr_in between Wasm and C world
Browse files Browse the repository at this point in the history
  • Loading branch information
lum1n0us committed Nov 18, 2021
1 parent 6c17add commit 6388af0
Show file tree
Hide file tree
Showing 5 changed files with 1,582 additions and 123 deletions.
115 changes: 103 additions & 12 deletions core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -991,30 +991,100 @@ wasi_random_get(wasm_exec_env_t exec_env, void *buf, uint32 buf_len)

static wasi_errno_t
wasi_sock_accept(wasm_exec_env_t exec_env, wasi_fd_t sockfd,
const wasi_sockaddr_t *addr, const wasi_socklen_t *addrlen,
wasi_fd_t *ret_new_socket)
const wasi_sockaddr_in_t *wasi_addr,
const wasi_socklen_t *addrlen, wasi_fd_t *ret_new_socket)
{
return convert_errno(EOPNOTSUPP);
struct sockaddr_in berkeley_addr = { 0 };
int new_fd;
socklen_t berkeley_addrlen;

if (!wasi_addr || !addrlen) {
return __WASI_EINVAL;
}

if (__WASI_AF_INET == wasi_addr->sin_family) {
berkeley_addr.sin_family = AF_INET;
}
else {
return __WASI_EAFNOSUPPORT;
}
berkeley_addr.sin_port = wasi_addr->sin_port;
berkeley_addr.sin_addr.s_addr = wasi_addr->sin_addr.s_addr;

berkeley_addrlen = sizeof(berkeley_addr);

new_fd =
accept(sockfd, (struct sockaddr *)&berkeley_addr, &berkeley_addrlen);
if (new_fd < 0) {
return convert_errno(errno);
}

memcpy(&berkeley_addrlen, addrlen, sizeof(wasi_socklen_t));
*ret_new_socket = new_fd;
return __WASI_ESUCCESS;
}

static wasi_errno_t
wasi_sock_bind(wasm_exec_env_t exec_env, wasi_fd_t sockfd,
const wasi_sockaddr_t *addr, wasi_socklen_t addrlen)
const wasi_sockaddr_in_t *wasi_addr, wasi_socklen_t addrlen)
{
return convert_errno(EOPNOTSUPP);
struct sockaddr_in berkeley_addr = { 0 };

if (!wasi_addr || !addrlen) {
return __WASI_EINVAL;
}

if (__WASI_AF_INET == wasi_addr->sin_family) {
berkeley_addr.sin_family = AF_INET;
}
else {
return __WASI_EAFNOSUPPORT;
}
berkeley_addr.sin_port = wasi_addr->sin_port;
berkeley_addr.sin_addr.s_addr = wasi_addr->sin_addr.s_addr;

if (bind(sockfd, (struct sockaddr *)&berkeley_addr, sizeof(berkeley_addr))
< 0) {
return convert_errno(errno);
}

return __WASI_ESUCCESS;
}

static wasi_errno_t
wasi_sock_connect(wasm_exec_env_t exec_env, wasi_fd_t sockfd,
const wasi_sockaddr_t *addr, wasi_socklen_t addrlen)
const wasi_sockaddr_in_t *wasi_addr, wasi_socklen_t addrlen)
{
return convert_errno(EOPNOTSUPP);
struct sockaddr_in berkeley_addr = { 0 };

if (!wasi_addr || !addrlen) {
return __WASI_EINVAL;
}

if (__WASI_AF_INET == wasi_addr->sin_family) {
berkeley_addr.sin_family = AF_INET;
}
else {
return __WASI_EAFNOSUPPORT;
}
berkeley_addr.sin_port = wasi_addr->sin_port;
berkeley_addr.sin_addr.s_addr = wasi_addr->sin_addr.s_addr;

if (connect(sockfd, (struct sockaddr *)&berkeley_addr,
sizeof(berkeley_addr))
< 0) {
return convert_errno(errno);
}
return __WASI_ESUCCESS;
}

static wasi_errno_t
wasi_sock_listen(wasm_exec_env_t exec_env, int32 backlog)
wasi_sock_listen(wasm_exec_env_t exec_env, wasi_fd_t sockfd, int32 backlog)
{
return convert_errno(EOPNOTSUPP);
if (listen(sockfd, backlog) < 0) {
return convert_errno(errno);
}
return __WASI_ESUCCESS;
}

static wasi_errno_t
Expand Down Expand Up @@ -1146,17 +1216,38 @@ wasi_sched_yield(wasm_exec_env_t exec_env)
}

static wasi_errno_t
wasi_sock_socket(wasm_exec_env_t exec_env, int32 domain, int32 type,
wasi_sock_socket(wasm_exec_env_t exec_env, int32 wasi_domain, int32 wasi_type,
int32 protocol, wasi_fd_t *ret_sockfd)
{
wasm_module_inst_t module_inst = get_module_inst(exec_env);
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
int fd;
int fd, berkeley_domain, berkeley_type;

if (!wasi_ctx)
return __WASI_EINVAL;

fd = socket(domain, type, protocol);
if (__WASI_AF_INET == wasi_domain) {
berkeley_domain = AF_INET;
}
else {
return __WASI_EAFNOSUPPORT;
}

if (__WASI_FILETYPE_SOCKET_DGRAM == wasi_type) {
berkeley_type = SOCK_DGRAM;
}
else if (__WASI_FILETYPE_SOCKET_STREAM == wasi_type) {
berkeley_type = SOCK_STREAM;
}
else {
return __WASI_ENOTSUP;
}

if (0 != protocol) {
return __WASI_EPROTONOSUPPORT;
}

fd = socket(berkeley_domain, berkeley_type, protocol);
if (fd < 0) {
return convert_errno(errno);
}
Expand Down
2 changes: 1 addition & 1 deletion core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ typedef __wasi_siflags_t wasi_siflags_t;
typedef __wasi_sdflags_t wasi_sdflags_t;
typedef __wasi_preopentype_t wasi_preopentype_t;
typedef __wasi_socklen_t wasi_socklen_t;
typedef __wasi_sockaddr_t wasi_sockaddr_t;
typedef __wasi_sockaddr_in_t wasi_sockaddr_in_t;

#ifdef __cplusplus
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -493,11 +493,35 @@ typedef uint16_t __wasi_sa_family_t;
_Static_assert(sizeof(__wasi_sa_family_t) == 2, "witx calculated size");
_Static_assert(_Alignof(__wasi_sa_family_t) == 2, "witx calculated align");

typedef uint16_t __wasi_in_port_t;

_Static_assert(sizeof(__wasi_in_port_t) == 2, "witx calculated size");
_Static_assert(_Alignof(__wasi_in_port_t) == 2, "witx calculated align");

typedef uint32_t __wasi_in_addr_t;

_Static_assert(sizeof(__wasi_in_addr_t) == 4, "witx calculated size");
_Static_assert(_Alignof(__wasi_in_addr_t) == 4, "witx calculated align");

typedef struct __wasi_sockaddr_t {
__wasi_sa_family_t sa_family;
char * sa_data;
} __wasi_sockaddr_t;

typedef struct __wasi_in_addr {
__wasi_in_addr_t s_addr;
} __wasi_in_addr;

typedef struct sockaddr_in_t {
__wasi_sa_family_t sin_family;
__wasi_in_port_t sin_port;
__wasi_in_addr sin_addr;
} __wasi_sockaddr_in_t;

/* sync with /path/to/wasi-libc/libc-bottom-half/headers/public/__header_sys_socket.h */
#define __WASI_AF_INET 1
#define __WASI_AF_INET6 2

#if defined(WASMTIME_SSP_WASI_API)
#define WASMTIME_SSP_SYSCALL_NAME(name) \
asm("__wasi_" #name)
Expand Down
4 changes: 2 additions & 2 deletions product-mini/platforms/linux/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,14 @@ if (WAMR_BUILD_TARGET MATCHES "X86_.*" OR WAMR_BUILD_TARGET STREQUAL "AMD_64")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mindirect-branch-register")
# UNDEFINED BEHAVIOR, refer to https://en.cppreference.com/w/cpp/language/ub
if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT WAMR_BUILD_JIT EQUAL 1)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined \
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address,undefined \
-fno-sanitize=bounds,bounds-strict,alignment \
-fno-sanitize-recover")
endif()
else ()
# UNDEFINED BEHAVIOR, refer to https://en.cppreference.com/w/cpp/language/ub
if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT WAMR_BUILD_JIT EQUAL 1)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined \
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address,undefined \
-fno-sanitize=bounds,alignment \
-fno-sanitize-recover")
endif()
Expand Down
Loading

0 comments on commit 6388af0

Please sign in to comment.