| #define _GNU_SOURCE |
| #include <unistd.h> |
| #include <errno.h> |
| #include <fcntl.h> |
| #include "syscall.h" |
| #include "libc.h" |
| |
| int __dup3(int old, int new, int flags) |
| { |
| int r; |
| #ifdef SYS_dup2 |
| if (old==new) return __syscall_ret(-EINVAL); |
| if (flags & O_CLOEXEC) { |
| while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY); |
| if (r!=-ENOSYS) return __syscall_ret(r); |
| } |
| while ((r=__syscall(SYS_dup2, old, new))==-EBUSY); |
| if (flags & O_CLOEXEC) __syscall(SYS_fcntl, new, F_SETFD, FD_CLOEXEC); |
| #else |
| while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY); |
| #endif |
| return __syscall_ret(r); |
| } |
| |
| weak_alias(__dup3, dup3); |