| /* Copyright (c) 2016 Google Inc. |
| * Barret Rhoden <brho@cs.berkeley.edu> |
| * See LICENSE for details. |
| * |
| * Pipes, now with openat! */ |
| |
| #include <errno.h> |
| #include <unistd.h> |
| #include <stddef.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| |
| int __pipe2(int pipedes[2], int flags) |
| { |
| int dirfd, dfd, d1fd, old_errno; |
| char old_errstr[MAX_ERRSTR_LEN]; |
| |
| if (!pipedes) { |
| __set_errno(EFAULT); |
| return -1; |
| } |
| dirfd = open("#pipe", O_PATH | (flags & O_CLOEXEC)); |
| if (dirfd < 0) |
| return -1; |
| dfd = openat(dirfd, "data", O_RDWR | flags); |
| if (dfd < 0) { |
| save_err(&old_errno, old_errstr); |
| close(dirfd); |
| restore_err(&old_errno, old_errstr); |
| return -1; |
| } |
| d1fd = openat(dirfd, "data1", O_RDWR | flags); |
| if (d1fd < 0) { |
| save_err(&old_errno, old_errstr); |
| close(dfd); |
| close(dirfd); |
| restore_err(&old_errno, old_errstr); |
| return -1; |
| } |
| pipedes[0] = dfd; |
| pipedes[1] = d1fd; |
| close(dirfd); |
| return 0; |
| } |
| weak_alias(__pipe2, pipe2) |