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

Updated sendto() to only broadcast on enabled interfaces

This commit is contained in:
Daniel Collins 2011-04-24 21:01:59 +00:00
parent 39233b20a1
commit c2e26c7cab
2 changed files with 28 additions and 9 deletions

View File

@ -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);

View File

@ -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);