:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / ws2_32 / misc / sndrcv.c
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS WinSock 2 DLL
4  * FILE:        misc/sndrcv.c
5  * PURPOSE:     Send/receive functions
6  * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7  * REVISIONS:
8  *   CSH 01/09-2000 Created
9  */
10 #include <ws2_32.h>
11 #include <catalog.h>
12
13 INT
14 EXPORT
15 recv(
16   IN  SOCKET s,
17   OUT CHAR FAR* buf,
18   IN  INT len,
19   IN  INT flags)
20 {
21   DWORD BytesReceived;
22   WSABUF WSABuf;
23
24   WS_DbgPrint(MAX_TRACE, ("s (0x%X)  buf (0x%X)  len (0x%X) flags (0x%X).\n",
25       s, buf, len, flags));
26
27   WSABuf.len = len;
28   WSABuf.buf = (CHAR FAR*)buf;
29
30   WSARecv(s, &WSABuf, 1, &BytesReceived, (LPDWORD)&flags, NULL, NULL);
31
32   return BytesReceived;
33 }
34
35
36 INT
37 EXPORT
38 recvfrom(
39   IN      SOCKET s,
40   OUT     CHAR FAR* buf,
41   IN      INT len,
42   IN      INT flags,
43   OUT     LPSOCKADDR from,
44   IN OUT  INT FAR* fromlen)
45 {
46   DWORD BytesReceived;
47   WSABUF WSABuf;
48
49   WS_DbgPrint(MAX_TRACE, ("s (0x%X)  buf (0x%X)  len (0x%X) flags (0x%X).\n",
50       s, buf, len, flags));
51
52   WSABuf.len = len;
53   WSABuf.buf = (CHAR FAR*)buf;
54
55   WSARecvFrom(s, &WSABuf, 1, &BytesReceived, (LPDWORD)&flags, from, fromlen, NULL, NULL);
56
57   return BytesReceived;
58 }
59
60
61 INT
62 EXPORT
63 send( 
64   IN  SOCKET s, 
65   IN  CONST CHAR FAR* buf, 
66   IN  INT len, 
67   IN  INT flags)
68 {
69   DWORD BytesSent;
70   WSABUF WSABuf;
71
72   WS_DbgPrint(MAX_TRACE, ("s (0x%X)  buf (0x%X)  len (0x%X) flags (0x%X).\n",
73       s, buf, len, flags));
74
75   WSABuf.len = len;
76   WSABuf.buf = (CHAR FAR*)buf;
77
78   return WSASend(s, &WSABuf, 1, &BytesSent, flags, NULL, NULL);
79 }
80
81
82 INT
83 EXPORT
84 sendto(
85   IN  SOCKET s,
86   IN  CONST CHAR FAR* buf,
87   IN  INT len,
88   IN  INT flags,
89   IN  CONST LPSOCKADDR to, 
90   IN  INT tolen)
91 {
92   DWORD BytesSent;
93   WSABUF WSABuf;
94
95   WS_DbgPrint(MAX_TRACE, ("s (0x%X)  buf (0x%X)  len (0x%X) flags (0x%X).\n",
96       s, buf, len, flags));
97
98   WSABuf.len = len;
99   WSABuf.buf = (CHAR FAR*)buf;
100
101   return WSASendTo(s, &WSABuf, 1, &BytesSent, flags, to, tolen, NULL, NULL);
102 }
103
104
105 INT
106 EXPORT
107 WSARecv(
108   IN      SOCKET s,
109   IN OUT  LPWSABUF lpBuffers,
110   IN      DWORD dwBufferCount,
111   OUT     LPDWORD lpNumberOfBytesRecvd,
112   IN OUT  LPDWORD lpFlags,
113   IN      LPWSAOVERLAPPED lpOverlapped,
114   IN      LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
115 {
116   PCATALOG_ENTRY Provider;
117   INT Errno;
118   INT Code;
119
120   WS_DbgPrint(MAX_TRACE, ("Called.\n"));
121
122   if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
123     WSASetLastError(WSAENOTSOCK);
124     return SOCKET_ERROR;
125   }
126
127   assert(Provider->ProcTable.lpWSPRecv);
128
129   Code = Provider->ProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount,
130     lpNumberOfBytesRecvd, lpFlags, lpOverlapped,
131     lpCompletionRoutine, NULL /* lpThreadId */, &Errno);
132
133   DereferenceProviderByPointer(Provider);
134
135   if (Code == SOCKET_ERROR)
136     WSASetLastError(Errno);
137
138   return Code;
139 }
140
141
142 INT
143 EXPORT
144 WSARecvDisconnect(
145   IN  SOCKET s,
146   OUT LPWSABUF lpInboundDisconnectData)
147 {
148   UNIMPLEMENTED
149
150   return 0;
151 }
152
153
154 INT
155 EXPORT
156 WSARecvFrom(
157   IN      SOCKET s,
158   IN OUT  LPWSABUF lpBuffers,
159   IN      DWORD dwBufferCount,
160   OUT     LPDWORD lpNumberOfBytesRecvd,
161   IN OUT  LPDWORD lpFlags,
162   OUT       LPSOCKADDR lpFrom,
163   IN OUT  LPINT lpFromlen,
164   IN      LPWSAOVERLAPPED lpOverlapped,
165   IN      LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
166 {
167   PCATALOG_ENTRY Provider;
168   INT Errno;
169   INT Code;
170
171   WS_DbgPrint(MAX_TRACE, ("Called.\n"));
172
173   if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
174     WSASetLastError(WSAENOTSOCK);
175     return SOCKET_ERROR;
176   }
177
178   assert(Provider->ProcTable.lpWSPRecvFrom);
179
180   Code = Provider->ProcTable.lpWSPRecvFrom(s, lpBuffers, dwBufferCount,
181     lpNumberOfBytesRecvd, lpFlags, lpFrom, lpFromlen, lpOverlapped,
182     lpCompletionRoutine, NULL /* lpThreadId */, &Errno);
183
184   DereferenceProviderByPointer(Provider);
185
186   if (Code == SOCKET_ERROR)
187     WSASetLastError(Errno);
188
189   return Code;
190 }
191
192
193 INT
194 EXPORT
195 WSASend(
196   IN  SOCKET s,
197   IN  LPWSABUF lpBuffers,
198   IN  DWORD dwBufferCount,
199   OUT LPDWORD lpNumberOfBytesSent,
200   IN  DWORD dwFlags,
201   IN  LPWSAOVERLAPPED lpOverlapped,
202   IN  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
203 {
204   PCATALOG_ENTRY Provider;
205   INT Errno;
206   INT Code;
207
208   WS_DbgPrint(MAX_TRACE, ("Called.\n"));
209
210   if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
211     WSASetLastError(WSAENOTSOCK);
212     return SOCKET_ERROR;
213   }
214
215   assert(Provider->ProcTable.lpWSPSend);
216
217   Code = Provider->ProcTable.lpWSPSend(s, lpBuffers, dwBufferCount,
218     lpNumberOfBytesSent, dwFlags, lpOverlapped,
219     lpCompletionRoutine, NULL /* lpThreadId */, &Errno);
220
221   DereferenceProviderByPointer(Provider);
222
223   if (Code == SOCKET_ERROR)
224     WSASetLastError(Errno);
225
226   return Code;
227 }
228
229
230 INT
231 EXPORT
232 WSASendDisconnect(
233   IN  SOCKET s,
234   IN  LPWSABUF lpOutboundDisconnectData)
235 {
236   UNIMPLEMENTED
237
238   return 0;
239 }
240
241
242 INT
243 EXPORT
244 WSASendTo(
245   IN  SOCKET s,
246   IN  LPWSABUF lpBuffers,
247   IN  DWORD dwBufferCount,
248   OUT LPDWORD lpNumberOfBytesSent,
249   IN  DWORD dwFlags,
250   IN  CONST LPSOCKADDR lpTo,
251   IN  INT iToLen,
252   IN  LPWSAOVERLAPPED lpOverlapped,
253   IN  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
254 {
255   PCATALOG_ENTRY Provider;
256   INT Errno;
257   INT Code;
258
259   WS_DbgPrint(MAX_TRACE, ("Called.\n"));
260
261   if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
262     WSASetLastError(WSAENOTSOCK);
263     return SOCKET_ERROR;
264   }
265
266   assert(Provider->ProcTable.lpWSPSendTo);
267
268   Code = Provider->ProcTable.lpWSPSendTo(s, lpBuffers, dwBufferCount,
269     lpNumberOfBytesSent, dwFlags, lpTo, iToLen, lpOverlapped,
270     lpCompletionRoutine, NULL /* lpThreadId */, &Errno);
271
272   DereferenceProviderByPointer(Provider);
273
274   if (Code == SOCKET_ERROR)
275     WSASetLastError(Errno);
276
277   return Code;
278 }
279
280 /* EOF */