diff --git a/src/ipxwrapper.def b/src/ipxwrapper.def index 5dd4bec..96db8d1 100644 --- a/src/ipxwrapper.def +++ b/src/ipxwrapper.def @@ -17,3 +17,4 @@ EXPORTS WSHEnumProtocols connect send + getpeername diff --git a/src/ipxwrapper.h b/src/ipxwrapper.h index ca5a8da..426e095 100644 --- a/src/ipxwrapper.h +++ b/src/ipxwrapper.h @@ -131,5 +131,6 @@ SOCKET WSAAPI r_socket(int,int,int); int PASCAL r_ioctlsocket(SOCKET fd, long cmd, u_long *argp); int PASCAL r_connect(SOCKET fd, const struct sockaddr *addr, int addrlen); int PASCAL r_send(SOCKET fd, const char *buf, int len, int flags); +int PASCAL r_getpeername(SOCKET fd, struct sockaddr *addr, int *addrlen); #endif /* !IPXWRAPPER_H */ diff --git a/src/ipxwrapper_stubs.txt b/src/ipxwrapper_stubs.txt index 22a3b05..3100977 100644 --- a/src/ipxwrapper_stubs.txt +++ b/src/ipxwrapper_stubs.txt @@ -33,3 +33,4 @@ r_socket:4 r_ioctlsocket:4 r_connect:4 r_send:4 +r_getpeername:4 diff --git a/src/winsock.c b/src/winsock.c index 9c67f83..afac248 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -817,3 +817,24 @@ int PASCAL send(SOCKET fd, const char *buf, int len, int flags) { return r_send(fd, buf, len, flags); } } + +int PASCAL getpeername(SOCKET fd, struct sockaddr *addr, int *addrlen) { + ipx_socket *sockptr = get_socket(fd); + + if(sockptr) { + if(!(sockptr->flags & IPX_CONNECTED)) { + RETURN_WSA(WSAENOTCONN, -1); + } + + if(*addrlen < sizeof(struct sockaddr_ipx)) { + RETURN_WSA(WSAEFAULT, -1); + } + + memcpy(addr, &(sockptr->remote_addr), sizeof(struct sockaddr_ipx)); + *addrlen = sizeof(struct sockaddr_ipx); + + RETURN(0); + }else{ + return r_getpeername(fd, addr, addrlen); + } +} diff --git a/src/wsock32_stubs.txt b/src/wsock32_stubs.txt index 73f9f2f..59c54ec 100644 --- a/src/wsock32_stubs.txt +++ b/src/wsock32_stubs.txt @@ -2,7 +2,7 @@ accept bind:0 closesocket:0 connect:0 -getpeername +getpeername:0 getsockname:0 getsockopt:0 htonl