blob: ce29e84ecf4f2fb1046388323985cfd520440400 [file] [log] [blame]
#define _GNU_SOURCE
#include <sys/socket.h>
#include <errno.h>
#include <fcntl.h>
#include "syscall.h"
#include "libc.h"
int accept4(int fd,
struct sockaddr* restrict addr,
socklen_t* restrict len,
int flg) {
if (!flg)
return accept(fd, addr, len);
int ret = syscall_cp(SYS_accept4, fd, addr, len, flg, 0, 0);
if (ret >= 0 || (errno != ENOSYS && errno != EINVAL))
return ret;
ret = accept(fd, addr, len);
if (ret < 0)
return ret;
if (flg & SOCK_CLOEXEC)
__syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC);
if (flg & SOCK_NONBLOCK)
__syscall(SYS_fcntl, ret, F_SETFL, O_NONBLOCK);
return ret;
}