ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

recv.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:   See COPYING in the top level directory
00003  * PROJECT:     ReactOS WinSock 2 API
00004  * FILE:        recv.c
00005  * PURPOSE:     Socket Receive Support
00006  * PROGRAMMER:  Alex Ionescu (alex@relsoft.net)
00007  */
00008 
00009 /* INCLUDES ******************************************************************/
00010 #include "ws2_32.h"
00011 
00012 //#define NDEBUG
00013 #include <debug.h>
00014 
00015 /* DATA **********************************************************************/
00016 
00017 /* FUNCTIONS *****************************************************************/
00018 
00019 /*
00020  * @implemented
00021  */
00022 INT
00023 WSAAPI
00024 recv(IN SOCKET s,
00025      OUT CHAR FAR* buf,
00026      IN INT len,
00027      IN INT flags)
00028 {
00029     PWSSOCKET Socket;
00030     INT Status;
00031     INT ErrorCode;
00032     LPWSATHREADID ThreadId;
00033     WSABUF Buffers;
00034     DWORD BytesReceived;
00035     DPRINT("recv: %lx, %lx, %lx, %p\n", s, flags, len, buf);
00036 
00037     /* Check for WSAStartup */
00038     if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS)
00039     {
00040         /* Get the Socket Context */
00041         if ((Socket = WsSockGetSocket(s)))
00042         {
00043             /* Setup the buffers */
00044             Buffers.buf = buf;
00045             Buffers.len = len;
00046 
00047             /* Make the call */
00048             Status = Socket->Provider->Service.lpWSPRecv(s,
00049                                                          &Buffers, 
00050                                                          1,
00051                                                          &BytesReceived, 
00052                                                          (LPDWORD)&flags, 
00053                                                          NULL,
00054                                                          NULL, 
00055                                                          ThreadId, 
00056                                                          &ErrorCode);
00057             /* Deference the Socket Context */
00058             WsSockDereference(Socket);
00059 
00060             /* Return Provider Value */
00061             if (Status == ERROR_SUCCESS)
00062             {
00063                 /* Handle OOB */
00064                 if (!(flags & MSG_PARTIAL)) return BytesReceived;
00065                 ErrorCode = WSAEMSGSIZE;
00066             }
00067 
00068             /* If everything seemed fine, then the WSP call failed itself */
00069             if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE;
00070         }
00071         else
00072         {
00073             /* No Socket Context Found */
00074             ErrorCode = WSAENOTSOCK;
00075         }
00076     }
00077 
00078     /* Return with an Error */
00079     SetLastError(ErrorCode);
00080     return SOCKET_ERROR;
00081 }
00082 
00083 /*
00084  * @implemented
00085  */
00086 INT
00087 WSAAPI
00088 recvfrom(IN SOCKET s,
00089          OUT CHAR FAR* buf,
00090          IN INT len,
00091          IN INT flags,
00092          OUT LPSOCKADDR from,
00093          IN OUT INT FAR* fromlen)
00094 {
00095     PWSSOCKET Socket;
00096     INT Status;
00097     INT ErrorCode;
00098     LPWSATHREADID ThreadId;
00099     WSABUF Buffers;
00100     DWORD BytesReceived;
00101     DPRINT("recvfrom: %lx, %lx, %lx, %p\n", s, flags, len, buf);
00102 
00103     /* Check for WSAStartup */
00104     if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS)
00105     {
00106         /* Get the Socket Context */
00107         if ((Socket = WsSockGetSocket(s)))
00108         {
00109             /* Setup the buffers */
00110             Buffers.buf = buf;
00111             Buffers.len = len;
00112 
00113             /* Make the call */
00114             Status = Socket->Provider->Service.lpWSPRecvFrom(s,
00115                                                              &Buffers, 
00116                                                              1,
00117                                                              &BytesReceived, 
00118                                                              (LPDWORD)&flags,
00119                                                              from,
00120                                                              fromlen,
00121                                                              NULL,
00122                                                              NULL, 
00123                                                              ThreadId, 
00124                                                              &ErrorCode);
00125             /* Deference the Socket Context */
00126             WsSockDereference(Socket);
00127 
00128             /* Return Provider Value */
00129             if (Status == ERROR_SUCCESS)
00130             {
00131                 /* Handle OOB */
00132                 if (!(flags & MSG_PARTIAL)) return BytesReceived;
00133                 ErrorCode = WSAEMSGSIZE;
00134             }
00135 
00136             /* If everything seemed fine, then the WSP call failed itself */
00137             if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE;
00138         }
00139         else
00140         {
00141             /* No Socket Context Found */
00142             ErrorCode = WSAENOTSOCK;
00143         }
00144     }
00145 
00146     /* Return with an Error */
00147     SetLastError(ErrorCode);
00148     return SOCKET_ERROR;
00149 }
00150 
00151 /*
00152  * @implemented
00153  */
00154 INT
00155 WSAAPI
00156 WSARecv(IN SOCKET s,
00157         IN OUT LPWSABUF lpBuffers,
00158         IN DWORD dwBufferCount,
00159         OUT LPDWORD lpNumberOfBytesRecvd,
00160         IN OUT LPDWORD lpFlags,
00161         IN LPWSAOVERLAPPED lpOverlapped,
00162         IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
00163 {
00164     PWSSOCKET Socket;
00165     INT Status;
00166     INT ErrorCode;
00167     LPWSATHREADID ThreadId;
00168     DPRINT("WSARecv: %lx, %lx, %lx, %p\n", s, lpFlags, dwBufferCount, lpBuffers);
00169 
00170     /* Check for WSAStartup */
00171     if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS)
00172     {
00173         /* Get the Socket Context */
00174         if ((Socket = WsSockGetSocket(s)))
00175         {
00176             /* Make the call */
00177             Status = Socket->Provider->Service.lpWSPRecv(s,
00178                                                          lpBuffers, 
00179                                                          dwBufferCount,
00180                                                          lpNumberOfBytesRecvd, 
00181                                                          lpFlags, 
00182                                                          lpOverlapped,
00183                                                          lpCompletionRoutine, 
00184                                                          ThreadId, 
00185                                                          &ErrorCode);
00186             /* Deference the Socket Context */
00187             WsSockDereference(Socket);
00188 
00189             /* Return Provider Value */
00190             if (Status == ERROR_SUCCESS) return Status;
00191 
00192             /* If everything seemed fine, then the WSP call failed itself */
00193             if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE;
00194         }
00195         else
00196         {
00197             /* No Socket Context Found */
00198             ErrorCode = WSAENOTSOCK;
00199         }
00200     }
00201 
00202     /* Return with an Error */
00203     SetLastError(ErrorCode);
00204     return SOCKET_ERROR;
00205 }
00206 
00207 /*
00208  * @implemented
00209  */
00210 INT
00211 WSAAPI
00212 WSARecvDisconnect(IN SOCKET s,
00213                   OUT LPWSABUF lpInboundDisconnectData)
00214 {
00215     PWSPROCESS Process;
00216     PWSTHREAD Thread;
00217     PWSSOCKET Socket;
00218     INT ErrorCode;
00219     INT Status;
00220     DPRINT("WSARecvDisconnect: %lx %p\n", s, lpInboundDisconnectData);
00221 
00222     /* Enter prolog */
00223     if ((ErrorCode = WsApiProlog(&Process, &Thread)) == ERROR_SUCCESS)
00224     {
00225         /* Get the Socket Context */
00226         if ((Socket = WsSockGetSocket(s)))
00227         {
00228             /* Make the call */
00229             Status = Socket->Provider->Service.lpWSPRecvDisconnect(s,
00230                                                                    lpInboundDisconnectData,
00231                                                                    &ErrorCode);
00232             /* Deference the Socket Context */
00233             WsSockDereference(Socket);
00234 
00235             /* Return Provider Value */
00236             if (Status == ERROR_SUCCESS) return ERROR_SUCCESS;
00237         }
00238         else
00239         {
00240             /* No Socket Context Found */
00241             ErrorCode = WSAENOTSOCK;
00242         }
00243     }
00244 
00245     /* Return with an Error */
00246     SetLastError(ErrorCode);
00247     return SOCKET_ERROR;
00248 }
00249 
00250 /*
00251  * @implemented
00252  */
00253 INT
00254 WSAAPI
00255 WSARecvFrom(IN SOCKET s,
00256             IN OUT LPWSABUF lpBuffers,
00257             IN DWORD dwBufferCount,
00258             OUT LPDWORD lpNumberOfBytesRecvd,
00259             IN OUT LPDWORD lpFlags,
00260             OUT LPSOCKADDR lpFrom,
00261             IN OUT LPINT lpFromlen,
00262             IN LPWSAOVERLAPPED lpOverlapped,
00263             IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
00264 {
00265     PWSSOCKET Socket;
00266     INT Status;
00267     INT ErrorCode;
00268     LPWSATHREADID ThreadId;
00269     DPRINT("WSARecvFrom: %lx, %lx, %lx, %p\n", s, lpFlags, dwBufferCount, lpBuffers);
00270 
00271     /* Check for WSAStartup */
00272     if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS)
00273     {
00274         /* Get the Socket Context */
00275         if ((Socket = WsSockGetSocket(s)))
00276         {
00277             /* Make the call */
00278             Status = Socket->Provider->Service.lpWSPRecvFrom(s,
00279                                                              lpBuffers, 
00280                                                              dwBufferCount,
00281                                                              lpNumberOfBytesRecvd, 
00282                                                              lpFlags, 
00283                                                              lpFrom,
00284                                                              lpFromlen,
00285                                                              lpOverlapped,
00286                                                              lpCompletionRoutine,
00287                                                              ThreadId, 
00288                                                              &ErrorCode);
00289             /* Deference the Socket Context */
00290             WsSockDereference(Socket);
00291 
00292             /* Return Provider Value */
00293             if (Status == ERROR_SUCCESS) return Status;
00294 
00295             /* If everything seemed fine, then the WSP call failed itself */
00296             if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE;
00297         }
00298         else
00299         {
00300             /* No Socket Context Found */
00301             ErrorCode = WSAENOTSOCK;
00302         }
00303     }
00304 
00305     /* Return with an Error */
00306     SetLastError(ErrorCode);
00307     return SOCKET_ERROR;
00308 }

Generated on Sun May 27 2012 04:27:10 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.