X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Funistd%2Fpipe2.c;h=bbeabcbf27ece1205e0b1adc769f6cfecf60e845;hp=83282bb9c918976cc2203680ae75ad7da4e37c09;hb=f78cdbe8993d072bf60a65754544199016a1fe29;hpb=dc62790deec183697489d5fddea03c82f725e7fd diff --git a/src/unistd/pipe2.c b/src/unistd/pipe2.c index 83282bb9..bbeabcbf 100644 --- a/src/unistd/pipe2.c +++ b/src/unistd/pipe2.c @@ -1,8 +1,22 @@ -#define _GNU_SOURCE #include +#include +#include #include "syscall.h" -int pipe2(int fd[2], int flg) +int pipe2(int fd[2], int flag) { - return syscall(SYS_pipe2, fd, flg); + if (!flag) return syscall(SYS_pipe, fd); + int ret = __syscall(SYS_pipe2, fd, flag); + if (ret != -ENOSYS) return __syscall_ret(ret); + ret = __syscall(SYS_pipe, fd); + if (ret) return __syscall_ret(ret); + if (flag & O_CLOEXEC) { + __syscall(SYS_fcntl, fd[0], F_SETFD, FD_CLOEXEC); + __syscall(SYS_fcntl, fd[1], F_SETFD, FD_CLOEXEC); + } + if (flag & O_NONBLOCK) { + __syscall(SYS_fcntl, fd[0], F_SETFL, O_NONBLOCK); + __syscall(SYS_fcntl, fd[1], F_SETFL, O_NONBLOCK); + } + return 0; }