4a69bf96a8dd00053165e8317ad81320f106920c
[reactos.git] / reactos / dll / win32 / ws2_32_new / src / dupsock.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 API
4 * FILE: dll/win32/ws2_32_new/src/dupsock.c
5 * PURPOSE: Socket Duplication
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <ws2_32.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* FUNCTIONS *****************************************************************/
17
18 /*
19 * @implemented
20 */
21 INT
22 WSAAPI
23 WSADuplicateSocketA(IN SOCKET s,
24 IN DWORD dwProcessId,
25 OUT LPWSAPROTOCOL_INFOA lpProtocolInfo)
26 {
27 WSAPROTOCOL_INFOW ProtocolInfoW;
28 INT ErrorCode;
29 DPRINT("WSADuplicateSocketA: %lx, %lx, %p\n", s, dwProcessId, lpProtocolInfo);
30
31 /* Call the Unicode Function */
32 ErrorCode = WSADuplicateSocketW(s, dwProcessId, &ProtocolInfoW);
33
34 /* Check for success */
35 if (ErrorCode == ERROR_SUCCESS)
36 {
37 /* Convert Protocol Info to Ansi */
38 if (lpProtocolInfo)
39 {
40 /* Convert the information to ANSI */
41 ErrorCode = MapUnicodeProtocolInfoToAnsi(&ProtocolInfoW,
42 lpProtocolInfo);
43 }
44 else
45 {
46 /* Fail */
47 ErrorCode = WSAEFAULT;
48 }
49
50 /* Check if the conversion failed */
51 if (ErrorCode != ERROR_SUCCESS)
52 {
53 /* Set the last error and normalize the error */
54 SetLastError(ErrorCode);
55 ErrorCode = SOCKET_ERROR;
56 }
57 }
58
59 /* Return */
60 return ErrorCode;
61 }
62
63 /*
64 * @implemented
65 */
66 INT
67 WSAAPI
68 WSADuplicateSocketW(IN SOCKET s,
69 IN DWORD dwProcessId,
70 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo)
71 {
72 PWSSOCKET Socket;
73 INT Status;
74 INT ErrorCode;
75 DPRINT("WSADuplicateSocketW: %lx, %lx, %p\n", s, dwProcessId, lpProtocolInfo);
76
77 /* Check for WSAStartup */
78 if ((ErrorCode = WsQuickProlog()) == ERROR_SUCCESS)
79 {
80 /* Get the Socket Context */
81 if ((Socket = WsSockGetSocket(s)))
82 {
83 /* Make the call */
84 Status = Socket->Provider->Service.lpWSPDuplicateSocket(s,
85 dwProcessId,
86 lpProtocolInfo,
87 &ErrorCode);
88 /* Deference the Socket Context */
89 WsSockDereference(Socket);
90
91 /* Return Provider Value */
92 if (Status == ERROR_SUCCESS) return Status;
93
94 /* If everything seemed fine, then the WSP call failed itself */
95 if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE;
96 }
97 else
98 {
99 /* No Socket Context Found */
100 ErrorCode = WSAENOTSOCK;
101 }
102 }
103
104 /* Return with an Error */
105 SetLastError(ErrorCode);
106 return SOCKET_ERROR;
107 }