2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 API
4 * FILE: dll/win32/ws2_32_new/src/recv.c
5 * PURPOSE: Socket Receive Support
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
9 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
31 LPWSATHREADID ThreadId
;
34 DPRINT("recv: %lx, %lx, %lx, %p\n", s
, flags
, len
, buf
);
36 /* Check for WSAStartup */
37 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
39 /* Get the Socket Context */
40 if ((Socket
= WsSockGetSocket(s
)))
42 /* Setup the buffers */
47 Status
= Socket
->Provider
->Service
.lpWSPRecv(s
,
56 /* Deference the Socket Context */
57 WsSockDereference(Socket
);
59 /* Return Provider Value */
60 if (Status
== ERROR_SUCCESS
)
63 if (!(flags
& MSG_PARTIAL
)) return BytesReceived
;
64 ErrorCode
= WSAEMSGSIZE
;
67 /* If everything seemed fine, then the WSP call failed itself */
68 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
72 /* No Socket Context Found */
73 ErrorCode
= WSAENOTSOCK
;
77 /* Return with an Error */
78 SetLastError(ErrorCode
);
92 IN OUT INT FAR
* fromlen
)
97 LPWSATHREADID ThreadId
;
100 DPRINT("recvfrom: %lx, %lx, %lx, %p\n", s
, flags
, len
, buf
);
102 /* Check for WSAStartup */
103 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
105 /* Get the Socket Context */
106 if ((Socket
= WsSockGetSocket(s
)))
108 /* Setup the buffers */
113 Status
= Socket
->Provider
->Service
.lpWSPRecvFrom(s
,
124 /* Deference the Socket Context */
125 WsSockDereference(Socket
);
127 /* Return Provider Value */
128 if (Status
== ERROR_SUCCESS
)
131 if (!(flags
& MSG_PARTIAL
)) return BytesReceived
;
132 ErrorCode
= WSAEMSGSIZE
;
135 /* If everything seemed fine, then the WSP call failed itself */
136 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
140 /* No Socket Context Found */
141 ErrorCode
= WSAENOTSOCK
;
145 /* Return with an Error */
146 SetLastError(ErrorCode
);
156 IN OUT LPWSABUF lpBuffers
,
157 IN DWORD dwBufferCount
,
158 OUT LPDWORD lpNumberOfBytesRecvd
,
159 IN OUT LPDWORD lpFlags
,
160 IN LPWSAOVERLAPPED lpOverlapped
,
161 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
166 LPWSATHREADID ThreadId
;
167 DPRINT("WSARecv: %lx, %lx, %lx, %p\n", s
, lpFlags
, dwBufferCount
, lpBuffers
);
169 /* Check for WSAStartup */
170 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
172 /* Get the Socket Context */
173 if ((Socket
= WsSockGetSocket(s
)))
176 Status
= Socket
->Provider
->Service
.lpWSPRecv(s
,
179 lpNumberOfBytesRecvd
,
185 /* Deference the Socket Context */
186 WsSockDereference(Socket
);
188 /* Return Provider Value */
189 if (Status
== ERROR_SUCCESS
) return Status
;
191 /* If everything seemed fine, then the WSP call failed itself */
192 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
196 /* No Socket Context Found */
197 ErrorCode
= WSAENOTSOCK
;
201 /* Return with an Error */
202 SetLastError(ErrorCode
);
211 WSARecvDisconnect(IN SOCKET s
,
212 OUT LPWSABUF lpInboundDisconnectData
)
219 DPRINT("WSARecvDisconnect: %lx %p\n", s
, lpInboundDisconnectData
);
222 if ((ErrorCode
= WsApiProlog(&Process
, &Thread
)) == ERROR_SUCCESS
)
224 /* Get the Socket Context */
225 if ((Socket
= WsSockGetSocket(s
)))
228 Status
= Socket
->Provider
->Service
.lpWSPRecvDisconnect(s
,
229 lpInboundDisconnectData
,
231 /* Deference the Socket Context */
232 WsSockDereference(Socket
);
234 /* Return Provider Value */
235 if (Status
== ERROR_SUCCESS
) return ERROR_SUCCESS
;
239 /* No Socket Context Found */
240 ErrorCode
= WSAENOTSOCK
;
244 /* Return with an Error */
245 SetLastError(ErrorCode
);
254 WSARecvFrom(IN SOCKET s
,
255 IN OUT LPWSABUF lpBuffers
,
256 IN DWORD dwBufferCount
,
257 OUT LPDWORD lpNumberOfBytesRecvd
,
258 IN OUT LPDWORD lpFlags
,
259 OUT LPSOCKADDR lpFrom
,
260 IN OUT LPINT lpFromlen
,
261 IN LPWSAOVERLAPPED lpOverlapped
,
262 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
267 LPWSATHREADID ThreadId
;
268 DPRINT("WSARecvFrom: %lx, %lx, %lx, %p\n", s
, lpFlags
, dwBufferCount
, lpBuffers
);
270 /* Check for WSAStartup */
271 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
273 /* Get the Socket Context */
274 if ((Socket
= WsSockGetSocket(s
)))
277 Status
= Socket
->Provider
->Service
.lpWSPRecvFrom(s
,
280 lpNumberOfBytesRecvd
,
288 /* Deference the Socket Context */
289 WsSockDereference(Socket
);
291 /* Return Provider Value */
292 if (Status
== ERROR_SUCCESS
) return Status
;
294 /* If everything seemed fine, then the WSP call failed itself */
295 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
299 /* No Socket Context Found */
300 ErrorCode
= WSAENOTSOCK
;
304 /* Return with an Error */
305 SetLastError(ErrorCode
);