mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-08 20:56:13 +00:00
Update __wasi_sock_accept signature to match wasi_snapshot_preview1 (#1531)
The function was introduced to WASI about half a year ago after it already existed in WAMR. It caused problems with compiling `wasi_socket_ext.c` with the wasi-sdk that already had this hostcall exported (wasi-sdk >= 15). The approach we take is the following: - we update WASI interface to be compatible with the wasi_snapshot_preview1 - compilation with `wasi_socket_ext.c` supports both wasi_sdk >= 15 and wasi_sdk < 15 (although we intend to drop support for < 15 at one point of time) - we override `accept()` from wasi-libc - we do that because `accept()` in `wasi-libc` doesn't support returning address (as it doesn't have `getpeername()` implemented), so `wasi_socket_ext.c` offers more functionality right now Resolves #1167 and #1528. [1] https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/witx/wasi_snapshot_preview1.witx
This commit is contained in:
parent
dfd16f8e4f
commit
c505da7464
|
@ -140,8 +140,10 @@ struct addrinfo {
|
||||||
struct addrinfo *ai_next; /* Pointer to next in list. */
|
struct addrinfo *ai_next; /* Pointer to next in list. */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef __WASI_RIGHTS_SOCK_ACCEPT
|
||||||
int
|
int
|
||||||
accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
|
accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
|
bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
|
||||||
|
@ -191,21 +193,30 @@ void
|
||||||
freeaddrinfo(struct addrinfo *res);
|
freeaddrinfo(struct addrinfo *res);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __wasi_sock_accept was introduced in wasi-sdk v15. To
|
||||||
|
* temporarily maintain backward compatibility with the old
|
||||||
|
* wasi-sdk, we explicitly add that implementation here so it works
|
||||||
|
* with older versions of the SDK.
|
||||||
|
*/
|
||||||
|
#ifndef __WASI_RIGHTS_SOCK_ACCEPT
|
||||||
/**
|
/**
|
||||||
* Accept a connection on a socket
|
* Accept a connection on a socket
|
||||||
* Note: This is similar to `accept`
|
* Note: This is similar to `accept`
|
||||||
*/
|
*/
|
||||||
int32_t
|
int32_t
|
||||||
__imported_wasi_snapshot_preview1_sock_accept(int32_t arg0, int32_t arg1)
|
__imported_wasi_snapshot_preview1_sock_accept(int32_t arg0, int32_t arg1,
|
||||||
|
int32_t arg2)
|
||||||
__attribute__((__import_module__("wasi_snapshot_preview1"),
|
__attribute__((__import_module__("wasi_snapshot_preview1"),
|
||||||
__import_name__("sock_accept")));
|
__import_name__("sock_accept")));
|
||||||
|
|
||||||
static inline __wasi_errno_t
|
static inline __wasi_errno_t
|
||||||
__wasi_sock_accept(__wasi_fd_t fd, __wasi_fd_t *fd_new)
|
__wasi_sock_accept(__wasi_fd_t fd, __wasi_fdflags_t flags, __wasi_fd_t *fd_new)
|
||||||
{
|
{
|
||||||
return (__wasi_errno_t)__imported_wasi_snapshot_preview1_sock_accept(
|
return (__wasi_errno_t)__imported_wasi_snapshot_preview1_sock_accept(
|
||||||
(int32_t)fd, (int32_t)fd_new);
|
(int32_t)fd, (int32_t)flags, (int32_t)fd_new);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the local address to which the socket is bound.
|
* Returns the local address to which the socket is bound.
|
||||||
|
|
|
@ -140,7 +140,7 @@ accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
||||||
__wasi_fd_t new_sockfd;
|
__wasi_fd_t new_sockfd;
|
||||||
__wasi_errno_t error;
|
__wasi_errno_t error;
|
||||||
|
|
||||||
error = __wasi_sock_accept(sockfd, &new_sockfd);
|
error = __wasi_sock_accept(sockfd, 0, &new_sockfd);
|
||||||
HANDLE_ERROR(error)
|
HANDLE_ERROR(error)
|
||||||
|
|
||||||
error = getpeername(new_sockfd, addr, addrlen);
|
error = getpeername(new_sockfd, addr, addrlen);
|
||||||
|
|
|
@ -1004,7 +1004,8 @@ wasi_random_get(wasm_exec_env_t exec_env, void *buf, uint32 buf_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
wasi_sock_accept(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_fd_t *fd_new)
|
wasi_sock_accept(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_fdflags_t flags,
|
||||||
|
wasi_fd_t *fd_new)
|
||||||
{
|
{
|
||||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||||
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
|
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
|
||||||
|
@ -1015,7 +1016,7 @@ wasi_sock_accept(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_fd_t *fd_new)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_accept(curfds, fd, fd_new);
|
return wasi_ssp_sock_accept(curfds, fd, flags, fd_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -2156,7 +2157,7 @@ static NativeSymbol native_symbols_libc_wasi[] = {
|
||||||
REG_NATIVE_FUNC(proc_exit, "(i)"),
|
REG_NATIVE_FUNC(proc_exit, "(i)"),
|
||||||
REG_NATIVE_FUNC(proc_raise, "(i)i"),
|
REG_NATIVE_FUNC(proc_raise, "(i)i"),
|
||||||
REG_NATIVE_FUNC(random_get, "(*~)i"),
|
REG_NATIVE_FUNC(random_get, "(*~)i"),
|
||||||
REG_NATIVE_FUNC(sock_accept, "(i*)i"),
|
REG_NATIVE_FUNC(sock_accept, "(ii*)i"),
|
||||||
REG_NATIVE_FUNC(sock_addr_local, "(i*)i"),
|
REG_NATIVE_FUNC(sock_addr_local, "(i*)i"),
|
||||||
REG_NATIVE_FUNC(sock_addr_remote, "(i*)i"),
|
REG_NATIVE_FUNC(sock_addr_remote, "(i*)i"),
|
||||||
REG_NATIVE_FUNC(sock_addr_resolve, "($$**i*)i"),
|
REG_NATIVE_FUNC(sock_addr_resolve, "($$**i*)i"),
|
||||||
|
|
|
@ -1008,7 +1008,7 @@ wasi_ssp_sock_accept(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t fd, __wasi_fd_t *fd_new
|
__wasi_fd_t fd, __wasi_fdflags_t flags, __wasi_fd_t *fd_new
|
||||||
) __attribute__((__warn_unused_result__));
|
) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
|
@ -1199,7 +1199,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_keep_alive(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_keep_alive) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_keep_alive) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_reuse_addr(
|
__wasi_errno_t wasmtime_ssp_sock_set_reuse_addr(
|
||||||
|
@ -1215,7 +1215,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_reuse_addr(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_addr) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_addr) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_reuse_port(
|
__wasi_errno_t wasmtime_ssp_sock_set_reuse_port(
|
||||||
|
@ -1231,15 +1231,15 @@ __wasi_errno_t wasmtime_ssp_sock_get_reuse_port(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_port) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_port) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_linger(
|
__wasi_errno_t wasmtime_ssp_sock_set_linger(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled,
|
bool is_enabled,
|
||||||
int linger_s
|
int linger_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_linger) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_linger) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
|
@ -1263,7 +1263,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_broadcast(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_broadcast) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_broadcast) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_no_delay(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_no_delay(
|
||||||
|
@ -1279,7 +1279,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_tcp_no_delay(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_no_delay) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_no_delay) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_quick_ack(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_quick_ack(
|
||||||
|
@ -1295,7 +1295,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_tcp_quick_ack(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_quick_ack) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_quick_ack) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_keep_idle(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_keep_idle(
|
||||||
|
@ -1343,7 +1343,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_tcp_fastopen_connect(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_fastopen_connect) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_fastopen_connect) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ip_multicast_loop(
|
__wasi_errno_t wasmtime_ssp_sock_set_ip_multicast_loop(
|
||||||
|
@ -1361,7 +1361,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_ip_multicast_loop(
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool ipv6,
|
bool ipv6,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_multicast_loop) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_multicast_loop) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ip_add_membership(
|
__wasi_errno_t wasmtime_ssp_sock_set_ip_add_membership(
|
||||||
|
@ -1427,7 +1427,7 @@ __wasi_errno_t wasmtime_ssp_sock_get_ipv6_only(
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ipv6_only) __attribute__((__warn_unused_result__));
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ipv6_only) __attribute__((__warn_unused_result__));
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sched_yield(void)
|
__wasi_errno_t wasmtime_ssp_sched_yield(void)
|
||||||
|
|
|
@ -2905,7 +2905,7 @@ wasi_ssp_sock_accept(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
#endif
|
||||||
__wasi_fd_t fd, __wasi_fd_t *fd_new)
|
__wasi_fd_t fd, __wasi_fdflags_t flags, __wasi_fd_t *fd_new)
|
||||||
{
|
{
|
||||||
__wasi_filetype_t wasi_type;
|
__wasi_filetype_t wasi_type;
|
||||||
__wasi_rights_t max_base, max_inheriting;
|
__wasi_rights_t max_base, max_inheriting;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user