OLD | NEW |
1 #define _GNU_SOURCE | 1 #define _GNU_SOURCE |
2 #include <unistd.h> | 2 #include <unistd.h> |
3 #include <errno.h> | 3 #include <errno.h> |
4 #include <fcntl.h> | 4 #include <fcntl.h> |
5 #include "syscall.h" | 5 #include "syscall.h" |
6 #include "libc.h" | 6 #include "libc.h" |
7 | 7 |
8 int __dup3(int old, int new, int flags) | 8 int __dup3(int old, int new, int flags) { |
9 { | 9 int r; |
10 » int r; | |
11 #ifdef SYS_dup2 | 10 #ifdef SYS_dup2 |
12 » if (old==new) return __syscall_ret(-EINVAL); | 11 if (old == new) |
13 » if (flags & O_CLOEXEC) { | 12 return __syscall_ret(-EINVAL); |
14 » » while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY); | 13 if (flags & O_CLOEXEC) { |
15 » » if (r!=-ENOSYS) return __syscall_ret(r); | 14 while ((r = __syscall(SYS_dup3, old, new, flags)) == -EBUSY) |
16 » } | 15 ; |
17 » while ((r=__syscall(SYS_dup2, old, new))==-EBUSY); | 16 if (r != -ENOSYS) |
18 » if (flags & O_CLOEXEC) __syscall(SYS_fcntl, new, F_SETFD, FD_CLOEXEC); | 17 return __syscall_ret(r); |
| 18 } |
| 19 while ((r = __syscall(SYS_dup2, old, new)) == -EBUSY) |
| 20 ; |
| 21 if (flags & O_CLOEXEC) |
| 22 __syscall(SYS_fcntl, new, F_SETFD, FD_CLOEXEC); |
19 #else | 23 #else |
20 » while ((r=__syscall(SYS_dup3, old, new, flags))==-EBUSY); | 24 while ((r = __syscall(SYS_dup3, old, new, flags)) == -EBUSY) |
| 25 ; |
21 #endif | 26 #endif |
22 » return __syscall_ret(r); | 27 return __syscall_ret(r); |
23 } | 28 } |
24 | 29 |
25 weak_alias(__dup3, dup3); | 30 weak_alias(__dup3, dup3); |
OLD | NEW |