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)11dup2(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