accept4.c 579 B

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