pipe2.c 579 B

12345678910111213141516171819202122
  1. #include <unistd.h>
  2. #include <errno.h>
  3. #include <fcntl.h>
  4. #include "syscall.h"
  5. int pipe2(int fd[2], int flag)
  6. {
  7. if (!flag) return syscall(SYS_pipe, fd);
  8. int ret = __syscall(SYS_pipe2, fd, flag);
  9. if (ret != -ENOSYS) return __syscall_ret(ret);
  10. ret = syscall(SYS_pipe, fd);
  11. if (ret) return __syscall_ret(ret);
  12. if (flag & O_CLOEXEC) {
  13. fcntl(fd[0], F_SETFD, FD_CLOEXEC);
  14. fcntl(fd[1], F_SETFD, FD_CLOEXEC);
  15. }
  16. if (flag & O_NONBLOCK) {
  17. fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK);
  18. fcntl(fd[1], F_SETFL, fcntl(fd[1], F_GETFL) | O_NONBLOCK);
  19. }
  20. return 0;
  21. }