master
 1// SPDX-License-Identifier: BSD-2-Clause
 2
 3#include <sys/socket.h>
 4
 5#include <assert.h>
 6#include <wasi/api.h>
 7#include <errno.h>
 8#include <string.h>
 9
10int accept(int socket, struct sockaddr *restrict addr, socklen_t *restrict addrlen) {
11  int ret = -1;
12
13  __wasi_errno_t error = __wasi_sock_accept(socket, 0, &ret);
14
15  if (error != 0) {
16    errno = error;
17    return -1;
18  }
19
20  // Clear sockaddr to indicate undefined address
21  memset(addr, 0, *addrlen);
22  // might be AF_UNIX or AF_INET
23  addr->sa_family = AF_UNSPEC;
24  *addrlen = sizeof(struct sockaddr);
25
26  return ret;
27}
28
29int accept4(int socket, struct sockaddr *restrict addr, socklen_t *restrict addrlen, int flags) {
30  int ret = -1;
31
32  if (flags & ~(SOCK_NONBLOCK | SOCK_CLOEXEC)) {
33    errno = EINVAL;
34    return -1;
35  }
36
37  __wasi_errno_t error = __wasi_sock_accept(socket, (flags & SOCK_NONBLOCK) ? __WASI_FDFLAGS_NONBLOCK : 0, &ret);
38
39  if (error != 0) {
40    errno = error;
41    return -1;
42  }
43
44  // Clear sockaddr to indicate undefined address
45  memset(addr, 0, *addrlen);
46  // might be AF_UNIX or AF_INET
47  addr->sa_family = AF_UNSPEC;
48  *addrlen = sizeof(struct sockaddr);
49
50  return ret;
51}