|
|
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 |
|