xref: /aosp_15_r20/external/musl/src/unistd/dup2.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
2*c9945492SAndroid Build Coastguard Worker #include <errno.h>
3*c9945492SAndroid Build Coastguard Worker #include <fcntl.h>
4*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
5*c9945492SAndroid Build Coastguard Worker 
dup2(int old,int new)6*c9945492SAndroid Build Coastguard Worker int dup2(int old, int new)
7*c9945492SAndroid Build Coastguard Worker {
8*c9945492SAndroid Build Coastguard Worker 	int r;
9*c9945492SAndroid Build Coastguard Worker #ifdef SYS_dup2
10*c9945492SAndroid Build Coastguard Worker 	while ((r=__syscall(SYS_dup2, old, new))==-EBUSY);
11*c9945492SAndroid Build Coastguard Worker #else
12*c9945492SAndroid Build Coastguard Worker 	if (old==new) {
13*c9945492SAndroid Build Coastguard Worker 		r = __syscall(SYS_fcntl, old, F_GETFD);
14*c9945492SAndroid Build Coastguard Worker 		if (r >= 0) return old;
15*c9945492SAndroid Build Coastguard Worker 	} else {
16*c9945492SAndroid Build Coastguard Worker 		while ((r=__syscall(SYS_dup3, old, new, 0))==-EBUSY);
17*c9945492SAndroid Build Coastguard Worker 	}
18*c9945492SAndroid Build Coastguard Worker #endif
19*c9945492SAndroid Build Coastguard Worker 	return __syscall_ret(r);
20*c9945492SAndroid Build Coastguard Worker }
21