e0bf701
--- net-tools-1.60/ifconfig.c.broadcast	2004-11-03 12:05:30.000000000 +0100
e0bf701
+++ net-tools-1.60/ifconfig.c	2004-11-04 15:39:32.817077232 +0100
e0bf701
@@ -36,6 +36,7 @@
e0bf701
 #include <sys/ioctl.h>
e0bf701
 #include <netinet/in.h>
e0bf701
 #include <net/if.h>
e0bf701
+#include <netinet/ip.h>
e0bf701
 #include <net/if_arp.h>
e0bf701
 #include <stdio.h>
e0bf701
 #include <errno.h>
e0bf701
@@ -138,6 +139,7 @@
e0bf701
 	perror("SIOCSIFFLAGS");
e0bf701
 	return -1;
e0bf701
     }
e0bf701
+    
e0bf701
     return (0);
e0bf701
 }
e0bf701
 
e0bf701
@@ -212,17 +214,41 @@
e0bf701
     exit(0);
e0bf701
 }
e0bf701
 
e0bf701
-static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa)
e0bf701
+static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa, int new_bcast)
e0bf701
 {
e0bf701
     int err = 0;
e0bf701
-
e0bf701
-    memcpy((char *) &ifr->ifr_netmask, (char *) sa,
e0bf701
-	   sizeof(struct sockaddr));
e0bf701
+	struct sockaddr_in * ip_addr, * netmask, *bcast;
e0bf701
+    struct ifreq ifraddr;
e0bf701
+	struct ifreq ifrbcast;
e0bf701
+		
e0bf701
+	memcpy((char *) &ifr->ifr_netmask, (char *) sa,
e0bf701
+	   sizeof(struct sockaddr)); 
e0bf701
     if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) {
e0bf701
 	fprintf(stderr, "SIOCSIFNETMASK: %s\n",
e0bf701
 		strerror(errno));
e0bf701
 	err = 1;
e0bf701
     }
e0bf701
+	
e0bf701
+	if (new_bcast) {
e0bf701
+		memcpy(&ifraddr,ifr,sizeof(struct ifreq));
e0bf701
+		memcpy(&ifrbcast,ifr,sizeof(struct ifreq));
e0bf701
+	
e0bf701
+		if (ioctl(skfd, SIOCGIFADDR, &ifraddr) < 0) {
e0bf701
+			fprintf(stderr, "SIOCGIFADDR: %s\n", strerror(errno));
e0bf701
+			err = 1;
e0bf701
+    	}
e0bf701
+	
e0bf701
+		ip_addr = (struct sockaddr_in *)&ifraddr.ifr_addr;
e0bf701
+		netmask = (struct sockaddr_in *)&ifr->ifr_netmask;
e0bf701
+		bcast = (struct sockaddr_in *)&ifrbcast.ifr_broadaddr;
e0bf701
+		/* calculate new broadcast adress */
e0bf701
+		bcast->sin_addr.s_addr = ip_addr->sin_addr.s_addr | ~netmask->sin_addr.s_addr;
e0bf701
+		/* set new broadcast adress   */
e0bf701
+    	if (ioctl(skfd, SIOCSIFBRDADDR, &ifrbcast) < 0) {
e0bf701
+			fprintf(stderr, "SIOCSIFBROADCAST: %s\n", strerror(errno));
e0bf701
+			err = 1;
e0bf701
+    	}
e0bf701
+    }
e0bf701
     return 0;
e0bf701
 }
e0bf701
 
e0bf701
@@ -234,7 +260,7 @@
e0bf701
     struct aftype *ap;
e0bf701
     struct hwtype *hw;
e0bf701
     struct ifreq ifr;
e0bf701
-    int goterr = 0, didnetmask = 0, donetmask = 0;
e0bf701
+    int goterr = 0, didnetmask = 0, donetmask = 0, dobcast = 1;
e0bf701
     char **spp;
e0bf701
     int fd;
e0bf701
 #if HAVE_AFINET6
e0bf701
@@ -506,6 +532,7 @@
e0bf701
 			    strerror(errno));
e0bf701
 		    goterr = 1;
e0bf701
 		}
e0bf701
+		dobcast = 0;
e0bf701
 		spp++;
e0bf701
 	    }
e0bf701
 	    goterr |= set_flag(ifr.ifr_name, IFF_BROADCAST);
e0bf701
@@ -542,7 +569,7 @@
e0bf701
 		continue;
e0bf701
 	    }
e0bf701
 	    didnetmask++;
e0bf701
-	    goterr = set_netmask(ap->fd, &ifr, &sa);
e0bf701
+	    goterr = set_netmask(ap->fd, &ifr, &sa, dobcast);
e0bf701
 	    spp++;
e0bf701
 	    continue;
e0bf701
 	}
e0bf701
@@ -964,7 +991,7 @@
e0bf701
 	/* set CIDR netmask */
e0bf701
 	if (donetmask) {
e0bf701
 		donetmask = 0;
e0bf701
-		goterr = set_netmask(skfd, &ifr, &sa_netmask);
e0bf701
+		goterr = set_netmask(skfd, &ifr, &sa_netmask, dobcast);
e0bf701
 		didnetmask++;
e0bf701
 	}
e0bf701