diff options
Diffstat (limited to 'lib/libc_r/uthread/uthread_dup.c')
| -rw-r--r-- | lib/libc_r/uthread/uthread_dup.c | 37 | 
1 files changed, 37 insertions, 0 deletions
| diff --git a/lib/libc_r/uthread/uthread_dup.c b/lib/libc_r/uthread/uthread_dup.c new file mode 100644 index 000000000000..e6c459835be7 --- /dev/null +++ b/lib/libc_r/uthread/uthread_dup.c @@ -0,0 +1,37 @@ +#include <unistd.h> +#ifdef _THREAD_SAFE +#include <pthread.h> +#include "pthread_private.h" + +int +dup(int fd) +{ +	int             ret; + +	/* Lock the file descriptor: */ +	if ((ret = _thread_fd_lock(fd, FD_RDWR, NULL, __FILE__, __LINE__)) == 0) { +		/* Perform the 'dup' syscall: */ +		if ((ret = _thread_sys_dup(fd)) < 0) { +		} +		/* Initialise the file descriptor table entry: */ +		else if (_thread_fd_table_init(ret) != 0) { +			/* Quietly close the file: */ +			_thread_sys_close(ret); + +			/* Reset the file descriptor: */ +			ret = -1; +		} else { +			/* +			 * Save the file open flags so that they can be +			 * checked later:  +			 */ +			_thread_fd_table[ret]->flags = _thread_fd_table[fd]->flags; +		} + +		/* Unlock the file descriptor: */ +		_thread_fd_unlock(fd, FD_RDWR); +	} +	/* Return the completion status: */ +	return (ret); +} +#endif | 
