diff -up net-tools-1.60/ifconfig.c.bcast net-tools-1.60/ifconfig.c --- net-tools-1.60/ifconfig.c.bcast 2011-11-21 02:31:57.000000000 +0100 +++ net-tools-1.60/ifconfig.c 2011-12-02 16:16:06.793742329 +0100 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -239,9 +240,12 @@ static void version(void) exit(E_USAGE); } -static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa) +static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa, int new_bcast) { int err = 0; + struct sockaddr_in * ip_addr, * netmask, *bcast; + struct ifreq ifraddr; + struct ifreq ifrbcast; memcpy((char *) &ifr->ifr_netmask, (char *) sa, sizeof(struct sockaddr)); @@ -250,6 +254,25 @@ static int set_netmask(int skfd, struct strerror(errno)); err = 1; } + + if (new_bcast) { + memcpy(&ifraddr,ifr,sizeof(struct ifreq)); + memcpy(&ifrbcast,ifr,sizeof(struct ifreq)); + if (ioctl(skfd, SIOCGIFADDR, &ifraddr) < 0) { + fprintf(stderr, "SIOCGIFADDR: %s\n", strerror(errno)); + err = 1; + } + ip_addr = (struct sockaddr_in *)&ifraddr.ifr_addr; + netmask = (struct sockaddr_in *)&ifr->ifr_netmask; + bcast = (struct sockaddr_in *)&ifrbcast.ifr_broadaddr; + /* calculate new broadcast adress */ + bcast->sin_addr.s_addr = ip_addr->sin_addr.s_addr | ~netmask->sin_addr.s_addr; + /* set new broadcast adress */ + if (ioctl(skfd, SIOCSIFBRDADDR, &ifrbcast) < 0) { + fprintf(stderr, "SIOCSIFBROADCAST: %s\n", strerror(errno)); + err = 1; + } + } return err; } @@ -262,7 +285,7 @@ int main(int argc, char **argv) struct aftype *ap; struct hwtype *hw; struct ifreq ifr; - int goterr = 0, didnetmask = 0, neednetmask=0; + int goterr = 0, didnetmask = 0, neednetmask=0, dobcast = 1; char **spp; int fd; #if HAVE_AFINET6 @@ -547,6 +570,7 @@ int main(int argc, char **argv) strerror(errno)); goterr = 1; } + dobcast = 0; spp++; } goterr |= set_flag(ifr.ifr_name, IFF_BROADCAST); @@ -589,7 +613,7 @@ int main(int argc, char **argv) continue; } didnetmask++; - goterr |= set_netmask(ap->fd, &ifr, &sa); + goterr |= set_netmask(ap->fd, &ifr, &sa, dobcast); spp++; continue; } @@ -1045,7 +1069,7 @@ int main(int argc, char **argv) } if (neednetmask) { - goterr |= set_netmask(skfd, &ifr, &samask); + goterr |= set_netmask(skfd, &ifr, &samask, dobcast); didnetmask++; }