mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
Updated recv_packet to be usable in WSARecvEx.
This commit is contained in:
parent
cbf1dad417
commit
4646bfd6c8
@ -127,47 +127,6 @@ INT APIENTRY EnumProtocolsW(LPINT protocols, LPVOID buf, LPDWORD bsptr) {
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PASCAL WSARecvEx(SOCKET fd, char *buf, int len, int *flags) {
|
|
||||||
ipx_socket *sockptr = get_socket(fd);
|
|
||||||
|
|
||||||
if(sockptr) {
|
|
||||||
if(!(sockptr->flags & IPX_BOUND)) {
|
|
||||||
unlock_mutex();
|
|
||||||
|
|
||||||
WSASetLastError(WSAEINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock_mutex();
|
|
||||||
|
|
||||||
struct ipx_packet *packet = malloc(PACKET_BUF_SIZE);
|
|
||||||
if(!packet) {
|
|
||||||
WSASetLastError(ERROR_OUTOFMEMORY);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int rval = r_WSARecvEx(fd, (char*)packet, PACKET_BUF_SIZE, flags);
|
|
||||||
if(rval == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(packet->size <= len) {
|
|
||||||
memcpy(buf, packet->data, packet->size);
|
|
||||||
*flags = 0;
|
|
||||||
}else{
|
|
||||||
memcpy(buf, packet->data, len);
|
|
||||||
*flags = MSG_PARTIAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = packet->size;
|
|
||||||
free(packet);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}else{
|
|
||||||
return r_WSARecvEx(fd, buf, len, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SOCKET WSAAPI socket(int af, int type, int protocol) {
|
SOCKET WSAAPI socket(int af, int type, int protocol) {
|
||||||
debug("socket(%d, %d, %d)", af, type, protocol);
|
debug("socket(%d, %d, %d)", af, type, protocol);
|
||||||
|
|
||||||
@ -387,6 +346,7 @@ int WSAAPI getsockname(SOCKET fd, struct sockaddr *addr, int *addrlen) {
|
|||||||
* addr must be NULL or a region of memory big enough for a sockaddr_ipx
|
* addr must be NULL or a region of memory big enough for a sockaddr_ipx
|
||||||
*
|
*
|
||||||
* The mutex should be locked before calling and will be released before returning
|
* The mutex should be locked before calling and will be released before returning
|
||||||
|
* The size of the packet will be returned on success, even if it was truncated
|
||||||
*/
|
*/
|
||||||
static int recv_packet(ipx_socket *sockptr, char *buf, int bufsize, int flags, struct sockaddr_ipx *addr) {
|
static int recv_packet(ipx_socket *sockptr, char *buf, int bufsize, int flags, struct sockaddr_ipx *addr) {
|
||||||
SOCKET fd = sockptr->fd;
|
SOCKET fd = sockptr->fd;
|
||||||
@ -418,19 +378,11 @@ static int recv_packet(ipx_socket *sockptr, char *buf, int bufsize, int flags, s
|
|||||||
addr->sa_socket = packet->src_socket;
|
addr->sa_socket = packet->src_socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(packet->size <= bufsize) {
|
memcpy(buf, packet->data, packet->size <= bufsize ? packet->size : bufsize);
|
||||||
memcpy(buf, packet->data, packet->size);
|
rval = packet->size;
|
||||||
rval = packet->size;
|
free(packet);
|
||||||
free(packet);
|
|
||||||
|
return rval;
|
||||||
return rval;
|
|
||||||
}else{
|
|
||||||
memcpy(buf, packet->data, bufsize);
|
|
||||||
free(packet);
|
|
||||||
|
|
||||||
WSASetLastError(WSAEMSGSIZE);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
@ -453,6 +405,11 @@ int WSAAPI recvfrom(SOCKET fd, char *buf, int len, int flags, struct sockaddr *a
|
|||||||
*addrlen = sizeof(struct sockaddr_ipx);
|
*addrlen = sizeof(struct sockaddr_ipx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(rval > len) {
|
||||||
|
WSASetLastError(WSAEMSGSIZE);
|
||||||
|
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);
|
||||||
@ -463,12 +420,43 @@ int WSAAPI recv(SOCKET fd, char *buf, int len, int flags) {
|
|||||||
ipx_socket *sockptr = get_socket(fd);
|
ipx_socket *sockptr = get_socket(fd);
|
||||||
|
|
||||||
if(sockptr) {
|
if(sockptr) {
|
||||||
return recv_packet(sockptr, buf, len, flags, NULL);
|
int rval = recv_packet(sockptr, buf, len, flags, NULL);
|
||||||
|
|
||||||
|
if(rval > len) {
|
||||||
|
WSASetLastError(WSAEMSGSIZE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rval;
|
||||||
}else{
|
}else{
|
||||||
return r_recv(fd, buf, len, flags);
|
return r_recv(fd, buf, len, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PASCAL WSARecvEx(SOCKET fd, char *buf, int len, int *flags) {
|
||||||
|
ipx_socket *sockptr = get_socket(fd);
|
||||||
|
|
||||||
|
if(sockptr) {
|
||||||
|
int rval = recv_packet(sockptr, buf, len, 0, NULL);
|
||||||
|
|
||||||
|
if(rval > len) {
|
||||||
|
*flags = MSG_PARTIAL;
|
||||||
|
|
||||||
|
/* Wording of MSDN is unclear on what should be returned when
|
||||||
|
* an incomplete message is read, I think it should return the
|
||||||
|
* amount of data copied to the buffer.
|
||||||
|
*/
|
||||||
|
rval = len;
|
||||||
|
}else if(rval != -1) {
|
||||||
|
*flags = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}else{
|
||||||
|
return r_WSARecvEx(fd, buf, len, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define CHECK_OPTLEN(size) \
|
#define CHECK_OPTLEN(size) \
|
||||||
if(*optlen < size) {\
|
if(*optlen < size) {\
|
||||||
*optlen = size;\
|
*optlen = size;\
|
||||||
|
Loading…
x
Reference in New Issue
Block a user