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 ******************************************************************/
15 /* DATA **********************************************************************/
17 /* FUNCTIONS *****************************************************************/
25 IN CONST CHAR FAR
* buf
,
32 LPWSATHREADID ThreadId
;
35 DPRINT("send: %lx, %lx, %lx, %p\n", s
, flags
, len
, buf
);
37 /* Check for WSAStartup */
38 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
40 /* Get the Socket Context */
41 if ((Socket
= WsSockGetSocket(s
)))
43 /* Setup the buffers */
44 Buffers
.buf
= (PCHAR
)buf
;
48 Status
= Socket
->Provider
->Service
.lpWSPSend(s
,
57 /* Deference the Socket Context */
58 WsSockDereference(Socket
);
60 /* Return Provider Value */
61 if (Status
== ERROR_SUCCESS
) return BytesSent
;
63 /* If everything seemed fine, then the WSP call failed itself */
64 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
68 /* No Socket Context Found */
69 ErrorCode
= WSAENOTSOCK
;
73 /* Return with an Error */
74 SetLastError(ErrorCode
);
84 IN CONST CHAR FAR
* buf
,
87 IN CONST
struct sockaddr
*to
,
93 LPWSATHREADID ThreadId
;
96 DPRINT("send: %lx, %lx, %lx, %p\n", s
, flags
, len
, buf
);
98 /* Check for WSAStartup */
99 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
101 /* Get the Socket Context */
102 if ((Socket
= WsSockGetSocket(s
)))
104 /* Setup the buffers */
105 Buffers
.buf
= (PCHAR
)buf
;
109 Status
= Socket
->Provider
->Service
.lpWSPSendTo(s
,
120 /* Deference the Socket Context */
121 WsSockDereference(Socket
);
123 /* Return Provider Value */
124 if (Status
== ERROR_SUCCESS
) return BytesSent
;
126 /* If everything seemed fine, then the WSP call failed itself */
127 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
131 /* No Socket Context Found */
132 ErrorCode
= WSAENOTSOCK
;
136 /* Return with an Error */
137 SetLastError(ErrorCode
);
147 IN LPWSABUF lpBuffers
,
148 IN DWORD dwBufferCount
,
149 OUT LPDWORD lpNumberOfBytesSent
,
151 IN LPWSAOVERLAPPED lpOverlapped
,
152 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
157 LPWSATHREADID ThreadId
;
158 DPRINT("WSARecvFrom: %lx, %lx, %lx, %p\n", s
, dwFlags
, dwBufferCount
, lpBuffers
);
160 /* Check for WSAStartup */
161 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
163 /* Get the Socket Context */
164 if ((Socket
= WsSockGetSocket(s
)))
167 Status
= Socket
->Provider
->Service
.lpWSPSend(s
,
176 /* Deference the Socket Context */
177 WsSockDereference(Socket
);
179 /* Return Provider Value */
180 if (Status
== ERROR_SUCCESS
) return Status
;
182 /* If everything seemed fine, then the WSP call failed itself */
183 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
187 /* No Socket Context Found */
188 ErrorCode
= WSAENOTSOCK
;
192 /* Return with an Error */
193 SetLastError(ErrorCode
);
202 WSASendDisconnect(IN SOCKET s
,
203 IN LPWSABUF lpOutboundDisconnectData
)
210 DPRINT("WSASendDisconnect: %lx %p\n", s
, lpOutboundDisconnectData
);
213 if ((ErrorCode
= WsApiProlog(&Process
, &Thread
)) == ERROR_SUCCESS
)
215 /* Get the Socket Context */
216 if ((Socket
= WsSockGetSocket(s
)))
219 Status
= Socket
->Provider
->Service
.lpWSPSendDisconnect(s
,
220 lpOutboundDisconnectData
,
222 /* Deference the Socket Context */
223 WsSockDereference(Socket
);
225 /* Return Provider Value */
226 if (Status
== ERROR_SUCCESS
) return ERROR_SUCCESS
;
228 /* If everything seemed fine, then the WSP call failed itself */
229 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
233 /* No Socket Context Found */
234 ErrorCode
= WSAENOTSOCK
;
238 /* Return with an Error */
239 SetLastError(ErrorCode
);
248 WSASendTo(IN SOCKET s
,
249 IN LPWSABUF lpBuffers
,
250 IN DWORD dwBufferCount
,
251 OUT LPDWORD lpNumberOfBytesSent
,
253 IN CONST
struct sockaddr
*lpTo
,
255 IN LPWSAOVERLAPPED lpOverlapped
,
256 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
261 LPWSATHREADID ThreadId
;
262 DPRINT("WSASendTo: %lx, %lx, %lx, %p\n", s
, dwFlags
, dwBufferCount
, lpBuffers
);
264 /* Check for WSAStartup */
265 if ((ErrorCode
= WsQuickPrologTid(&ThreadId
)) == ERROR_SUCCESS
)
267 /* Get the Socket Context */
268 if ((Socket
= WsSockGetSocket(s
)))
271 Status
= Socket
->Provider
->Service
.lpWSPSendTo(s
,
282 /* Deference the Socket Context */
283 WsSockDereference(Socket
);
285 /* Return Provider Value */
286 if (Status
== ERROR_SUCCESS
) return Status
;
288 /* If everything seemed fine, then the WSP call failed itself */
289 if (ErrorCode
== NO_ERROR
) ErrorCode
= WSASYSCALLFAILURE
;
293 /* No Socket Context Found */
294 ErrorCode
= WSAENOTSOCK
;
298 /* Return with an Error */
299 SetLastError(ErrorCode
);