accept4.c raw

   1  #define _GNU_SOURCE
   2  #include <sys/socket.h>
   3  #include <errno.h>
   4  #include <fcntl.h>
   5  #include "syscall.h"
   6  
   7  int accept4(int fd, struct sockaddr *restrict addr, socklen_t *restrict len, int flg)
   8  {
   9  	if (!flg) return accept(fd, addr, len);
  10  	int ret = socketcall_cp(accept4, fd, addr, len, flg, 0, 0);
  11  	if (ret>=0 || (errno != ENOSYS && errno != EINVAL)) return ret;
  12  	ret = accept(fd, addr, len);
  13  	if (ret<0) return ret;
  14  	if (flg & SOCK_CLOEXEC)
  15  		__syscall(SYS_fcntl, ret, F_SETFD, FD_CLOEXEC);
  16  	if (flg & SOCK_NONBLOCK)
  17  		__syscall(SYS_fcntl, ret, F_SETFL, O_NONBLOCK);
  18  	return ret;
  19  }
  20