diff --git a/changes.txt b/changes.txt index 41dcfe0..5ef1969 100644 --- a/changes.txt +++ b/changes.txt @@ -3,6 +3,8 @@ Version 0.6.0: the wire using WinPcap. Bugfix: Include IPX socket number in address cache hash table key. + + Bugfix: Correctly initialise local sa_family of SPX client sockets. Version 0.5.0: Bugfix: Allow address reuse when only the binding socket has SO_REUSEADDR. diff --git a/src/winsock.c b/src/winsock.c index 459f921..6b3d9b2 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -536,6 +536,8 @@ int WSAAPI bind(SOCKET fd, const struct sockaddr *addr, int addrlen) return -1; } + sock->addr.sa_family = AF_IPX; + /* Resolve any wildcards in the requested address. */ if(!_resolve_bind_address(sock, &ipxaddr)) @@ -1939,6 +1941,8 @@ static int _connect_spx(ipx_socket *sock, struct sockaddr_ipx *ipxaddr) if(!(sock->flags & IPX_BOUND)) { + sock->addr.sa_family = AF_IPX; + struct sockaddr_in local_addr; int addrlen = sizeof(local_addr); diff --git a/tools/bind.c b/tools/bind.c index 341148c..46002fd 100644 --- a/tools/bind.c +++ b/tools/bind.c @@ -74,6 +74,8 @@ int main(int argc, const char **argv) int addrlen = sizeof(addr); assert(getsockname(sock, (struct sockaddr*)(&addr), &addrlen) == 0); + assert(addr.sa_family == AF_IPX); + char bound_addr[IPX_SADDR_SIZE]; ipx_to_string(bound_addr, addr32_in(addr.sa_netnum), addr48_in(addr.sa_nodenum), addr.sa_socket); diff --git a/tools/spx-client.c b/tools/spx-client.c index a577adc..93f7d37 100644 --- a/tools/spx-client.c +++ b/tools/spx-client.c @@ -91,6 +91,8 @@ int main(int argc, char **argv) assert(getsockname(sock, (struct sockaddr*)(&bound_addr), &addrlen) == 0); + assert(bound_addr.sa_family == AF_IPX); + char formatted_addr[IPX_SADDR_SIZE]; ipx_to_string(formatted_addr, addr32_in(bound_addr.sa_netnum), addr48_in(bound_addr.sa_nodenum), bound_addr.sa_socket); diff --git a/tools/spx-server.c b/tools/spx-server.c index 47ebc27..b30eb2b 100644 --- a/tools/spx-server.c +++ b/tools/spx-server.c @@ -92,6 +92,8 @@ int main(int argc, char **argv) int addrlen = sizeof(bind_addr); assert(getsockname(sock, (struct sockaddr*)(&bind_addr), &addrlen) == 0); + assert(bind_addr.sa_family == AF_IPX); + char formatted_addr[IPX_SADDR_SIZE]; ipx_to_string(formatted_addr, addr32_in(bind_addr.sa_netnum), addr48_in(bind_addr.sa_nodenum), bind_addr.sa_socket);