2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 API
5 * PURPOSE: Socket Sending Support.
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
9 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
24 IN CONST CHAR FAR
* buf
,
31 LPWSATHREADID ThreadId
;
34 DPRINT("send: %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 */
43 Buffers
.buf
= (PCHAR
)buf
;
47 Status
= Socket
->Provider
->Service
.lpWSPSend(s
,
56 /* Deference the Socket Context */
57 WsSockDereference(Socket
);
59 /* Return Provider Value */
60 if (Status
== ERROR_SUCCESS
) return BytesSent
;
62 /* If everything seemed fine, then the WSP call failed itself */
63 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
67 /* No Socket Context Found */
68 ErrorCode
= WSAENOTSOCK
;
72 /* Return with an Error */
73 SetLastError(ErrorCode
);
83 IN CONST CHAR FAR
* buf
,
86 IN CONST
struct sockaddr
*to
,
92 LPWSATHREADID ThreadId
;
95 DPRINT("send: %lx, %lx, %lx, %p\n", s
, flags
, len
, buf
);
97 /* Check for WSAStartup */
98 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
100 /* Get the Socket Context */
101 if ((Socket
= WsSockGetSocket(s
)))
103 /* Setup the buffers */
104 Buffers
.buf
= (PCHAR
)buf
;
108 Status
= Socket
->Provider
->Service
.lpWSPSendTo(s
,
119 /* Deference the Socket Context */
120 WsSockDereference(Socket
);
122 /* Return Provider Value */
123 if (Status
== ERROR_SUCCESS
) return BytesSent
;
125 /* If everything seemed fine, then the WSP call failed itself */
126 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
130 /* No Socket Context Found */
131 ErrorCode
= WSAENOTSOCK
;
135 /* Return with an Error */
136 SetLastError(ErrorCode
);
146 IN LPWSABUF lpBuffers
,
147 IN DWORD dwBufferCount
,
148 OUT LPDWORD lpNumberOfBytesSent
,
150 IN LPWSAOVERLAPPED lpOverlapped
,
151 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
156 LPWSATHREADID ThreadId
;
157 DPRINT("WSARecvFrom: %lx, %lx, %lx, %p\n", s
, dwFlags
, dwBufferCount
, lpBuffers
);
159 /* Check for WSAStartup */
160 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
162 /* Get the Socket Context */
163 if ((Socket
= WsSockGetSocket(s
)))
166 Status
= Socket
->Provider
->Service
.lpWSPSend(s
,
175 /* Deference the Socket Context */
176 WsSockDereference(Socket
);
178 /* Return Provider Value */
179 if (Status
== ERROR_SUCCESS
) return Status
;
181 /* If everything seemed fine, then the WSP call failed itself */
182 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
186 /* No Socket Context Found */
187 ErrorCode
= WSAENOTSOCK
;
191 /* Return with an Error */
192 SetLastError(ErrorCode
);
201 WSASendDisconnect(IN SOCKET s
,
202 IN LPWSABUF lpOutboundDisconnectData
)
209 DPRINT("WSASendDisconnect: %lx %p\n", s
, lpOutboundDisconnectData
);
212 if ((ErrorCode
= WsApiProlog(&Process
, &Thread
)) == ERROR_SUCCESS
)
214 /* Get the Socket Context */
215 if ((Socket
= WsSockGetSocket(s
)))
218 Status
= Socket
->Provider
->Service
.lpWSPSendDisconnect(s
,
219 lpOutboundDisconnectData
,
221 /* Deference the Socket Context */
222 WsSockDereference(Socket
);
224 /* Return Provider Value */
225 if (Status
== ERROR_SUCCESS
) return ERROR_SUCCESS
;
227 /* If everything seemed fine, then the WSP call failed itself */
228 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
232 /* No Socket Context Found */
233 ErrorCode
= WSAENOTSOCK
;
237 /* Return with an Error */
238 SetLastError(ErrorCode
);
247 WSASendTo(IN SOCKET s
,
248 IN LPWSABUF lpBuffers
,
249 IN DWORD dwBufferCount
,
250 OUT LPDWORD lpNumberOfBytesSent
,
252 IN CONST
struct sockaddr
*lpTo
,
254 IN LPWSAOVERLAPPED lpOverlapped
,
255 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
260 LPWSATHREADID ThreadId
;
261 DPRINT("WSASendTo: %lx, %lx, %lx, %p\n", s
, dwFlags
, dwBufferCount
, lpBuffers
);
263 /* Check for WSAStartup */
264 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
266 /* Get the Socket Context */
267 if ((Socket
= WsSockGetSocket(s
)))
270 Status
= Socket
->Provider
->Service
.lpWSPSendTo(s
,
281 /* Deference the Socket Context */
282 WsSockDereference(Socket
);
284 /* Return Provider Value */
285 if (Status
== ERROR_SUCCESS
) return Status
;
287 /* If everything seemed fine, then the WSP call failed itself */
288 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
292 /* No Socket Context Found */
293 ErrorCode
= WSAENOTSOCK
;
297 /* Return with an Error */
298 SetLastError(ErrorCode
);