pipe2.c raw

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