Print only the complete information if the fd is valid itself (in is_valid_fd).
[reactos.git] / reactos / lib / crt / io / dup.c
1 #include "precomp.h"
2 #include <io.h>
3 #include <errno.h>
4 #include <internal/file.h>
5
6
7 /*
8 * @implemented
9 */
10 int _dup(int handle)
11 {
12 HANDLE hFile;
13 HANDLE hProcess = GetCurrentProcess();
14 BOOL result;
15 int fd;
16 int mode;
17
18 hFile = (HANDLE)_get_osfhandle(handle);
19 if (hFile == INVALID_HANDLE_VALUE) {
20 __set_errno(EBADF);
21 return -1;
22 }
23 mode = __fileno_getmode(handle);
24 result = DuplicateHandle(hProcess,
25 hFile,
26 hProcess,
27 &hFile,
28 0,
29 mode & FNOINHERIT ? FALSE : TRUE,
30 DUPLICATE_SAME_ACCESS);
31 if (result == FALSE) {
32 _dosmaperr(GetLastError());
33 return -1;
34 }
35
36 fd = alloc_fd(hFile, mode);
37 if (fd < 0)
38 {
39 CloseHandle(hFile);
40 }
41 return fd;
42 }