1 /* $OpenBSD: uthread_dup2.c,v 1.7 2003/02/05 05:51:51 marc Exp $ */
2 /* PUBLIC DOMAIN <marc@snafu.org> */
3 
4 #include <errno.h>
5 #include <unistd.h>
6 #ifdef _THREAD_SAFE
7 #include <pthread.h>
8 #include "pthread_private.h"
9 
10 int
dup2(int fd,int newfd)11 dup2(int fd, int newfd)
12 {
13 	int	ret;
14 
15 	if (newfd >= 0 && newfd < _thread_dtablesize &&
16 	    newfd != _thread_kern_pipe[0] && newfd != _thread_kern_pipe[1]) {
17 		ret = _FD_LOCK(fd, FD_RDWR, NULL);
18 		if (ret == 0) {
19 			ret = _thread_sys_dup2(fd, newfd);
20 			if (ret != -1)
21 				if (_thread_fd_table_dup(fd, newfd) == -1) {
22 					close(newfd);
23 					ret = -1;
24 				}
25 			_FD_UNLOCK(fd, FD_RDWR);
26 		}
27 	} else {
28 		errno = EBADF;
29 		ret = -1;
30 	}
31 
32 	return (ret);
33 }
34 #endif
35