38 lines
828 B
C
38 lines
828 B
C
|
#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
|