1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Updated recvform to work with SPX sockets.

This commit is contained in:
Daniel Collins 2014-01-05 20:48:55 +00:00
parent 499bb4659c
commit 714543fac5

View File

@ -595,35 +595,61 @@ static int recv_packet(ipx_socket *sockptr, char *buf, int bufsize, int flags, s
return rval; return rval;
} }
int WSAAPI recvfrom(SOCKET fd, char *buf, int len, int flags, struct sockaddr *addr, int *addrlen) { int WSAAPI recvfrom(SOCKET fd, char *buf, int len, int flags, struct sockaddr *addr, int *addrlen)
ipx_socket *sockptr = get_socket(fd); {
ipx_socket *sock = get_socket(fd);
if(sockptr) { if(sock)
if(addr && addrlen && *addrlen < sizeof(struct sockaddr_ipx)) { {
if(sock->flags & IPX_IS_SPX)
{
/* Quoth the MSDN:
*
* For stream-oriented sockets such as those of type
* SOCK_STREAM, a call to recvfrom returns as much
* information as is currently available-up to the size
* of the buffer specified.
*
* The from and fromlen parameters are ignored for
* connection-oriented sockets.
*/
unlock_sockets();
return r_recv(fd, buf, len, flags);
}
else{
if(addr && addrlen && *addrlen < sizeof(struct sockaddr_ipx))
{
unlock_sockets(); unlock_sockets();
WSASetLastError(WSAEFAULT); WSASetLastError(WSAEFAULT);
return -1; return -1;
} }
int extended_addr = sockptr->flags & IPX_EXT_ADDR; int extended_addr = sock->flags & IPX_EXT_ADDR;
int rval = recv_packet(sockptr, buf, len, flags, (struct sockaddr_ipx_ext*)addr, *addrlen); int rval = recv_packet(sock, buf, len, flags, (struct sockaddr_ipx_ext*)addr, *addrlen);
/* The value pointed to by addrlen is only set if the recv call was /* The value pointed to by addrlen is only set if the
* successful, may not be correct. * recv call was successful, may not be correct.
*/ */
if(rval >= 0 && addr && addrlen) {
if(rval >= 0 && addr && addrlen)
{
*addrlen = (*addrlen >= sizeof(struct sockaddr_ipx_ext) && extended_addr ? sizeof(struct sockaddr_ipx_ext) : sizeof(struct sockaddr_ipx)); *addrlen = (*addrlen >= sizeof(struct sockaddr_ipx_ext) && extended_addr ? sizeof(struct sockaddr_ipx_ext) : sizeof(struct sockaddr_ipx));
} }
if(rval > len) { if(rval > len)
{
WSASetLastError(WSAEMSGSIZE); WSASetLastError(WSAEMSGSIZE);
return -1; return -1;
} }
return rval; return rval;
}else{ }
}
else{
return r_recvfrom(fd, buf, len, flags, addr, addrlen); return r_recvfrom(fd, buf, len, flags, addr, addrlen);
} }
} }