]> git.proxmox.com Git - wasi-libc.git/blob - libc-bottom-half/sources/accept.c
Don't use sbrk(0) to determine the initial heap size (#377)
[wasi-libc.git] / libc-bottom-half / sources / accept.c
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
10 int 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
29 int 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 }