/* Create a one-way communication channel (pipe). Actually the channel is two-way on the Hurd. If successful, two file descriptors are stored in FDS; bytes written on FDS[1] can be read from FDS[0]. Apply FLAGS to the new file descriptors. Returns 0 if successful, -1 if not. */ int __pipe2 (int fds[2], int flags) { int save_errno = errno; int result; if (flags & ~(O_CLOEXEC | O_NONBLOCK)) return __hurd_fail (EINVAL); flags = o_to_sock_flags (flags); /* The magic S_IFIFO protocol tells the pflocal server to create sockets which report themselves as FIFOs, as POSIX requires for pipes. */ result = __socketpair (PF_LOCAL, SOCK_STREAM | flags, S_IFIFO, fds); if (result == -1 && errno == EPROTONOSUPPORT) { /* We contacted an "old" pflocal server that doesn't support the magic S_IFIFO protocol. FIXME: Remove this junk somewhere in the future. */ __set_errno (save_errno); return __socketpair (PF_LOCAL, SOCK_STREAM | flags, 0, fds); } return result; }
/* Create a one-way communication channel (pipe). Actually the channel is two-way on the Hurd. If successful, two file descriptors are stored in FDS; bytes written on FDS[1] can be read from FDS[0]. Returns 0 if successful, -1 if not. */ int __pipe (int fds[2]) { int save_errno = errno; int result; /* The magic S_IFIFO protocol tells the pflocal server to create sockets which report themselves as FIFOs, as POSIX requires for pipes. */ result = __socketpair (PF_LOCAL, SOCK_STREAM, S_IFIFO, fds); if (result == -1 && errno == EPROTONOSUPPORT) { /* We contacted an "old" pflocal server that doesn't support the magic S_IFIFO protocol. FIXME: Remove this junk somewhere in the future. */ __set_errno (save_errno); return __socketpair (PF_LOCAL, SOCK_STREAM, 0, fds); } return result; }