From c2e26c7cabb6ab57eea53f1c2b9612201724f493 Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Sun, 24 Apr 2011 21:01:59 +0000 Subject: [PATCH] Updated sendto() to only broadcast on enabled interfaces --- src/ipxwrapper.c | 6 +++--- src/winsock.c | 31 +++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/ipxwrapper.c b/src/ipxwrapper.c index 2a0ad98..fec3024 100644 --- a/src/ipxwrapper.c +++ b/src/ipxwrapper.c @@ -322,7 +322,7 @@ static DWORD WINAPI router_main(LPVOID buf) { lock_mutex(); - add_host(packet->src_net, packet->src_node, ntohl(addr.sin_addr.s_addr)); + add_host(packet->src_net, packet->src_node, addr.sin_addr.s_addr); for(sockptr = sockets; sockptr; sockptr = sockptr->next) { if( @@ -470,8 +470,8 @@ static BOOL load_nics(void) { return FALSE; } - nnic->ipaddr = ntohl(inet_addr(ifptr->IpAddressList.IpAddress.String)); - nnic->bcast = nnic->ipaddr | ~ntohl(inet_addr(ifptr->IpAddressList.IpMask.String)); + nnic->ipaddr = inet_addr(ifptr->IpAddressList.IpAddress.String); + nnic->bcast = nnic->ipaddr | ~inet_addr(ifptr->IpAddressList.IpMask.String); memcpy(nnic->hwaddr, ifptr->Address, 6); diff --git a/src/winsock.c b/src/winsock.c index 70a8519..7b8d64d 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -659,16 +659,35 @@ int WSAAPI sendto(SOCKET fd, const char *buf, int len, int flags, const struct s packet->size = htons(len); memcpy(packet->data, buf, len); - /* TODO: Only send out enabled interfaces */ - struct sockaddr_in saddr; saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = INADDR_BROADCAST; saddr.sin_port = htons(global_conf.udp_port); - int sval = r_sendto(net_fd, (char*)packet, psize, 0, (struct sockaddr*)&saddr, sizeof(saddr)); - if(sval == -1) { - len = -1; + ipx_host *host = find_host(packet->dest_net, packet->dest_node); + + if(host) { + saddr.sin_addr.s_addr = host->ipaddr; + + int sval = r_sendto(net_fd, (char*)packet, psize, 0, (struct sockaddr*)&saddr, sizeof(saddr)); + if(sval == -1) { + len = -1; + } + }else{ + ipx_nic *nic = nics; + int success = 0; + + while(nic) { + saddr.sin_addr.s_addr = nic->bcast; + + int sval = r_sendto(net_fd, (char*)packet, psize, 0, (struct sockaddr*)&saddr, sizeof(saddr)); + if(sval >= 0) { + success = 1; + } + + nic = nic->next; + } + + len = success ? len : -1; } free(packet);