net-tools/net-tools-1.60-ifconfig-SIOCSIFNETMASK.diff

53 lines
1.3 KiB
Diff

--- net-tools-1.60/ifconfig.c.orig 2008-11-06 16:25:50.000000000 +0100
+++ net-tools-1.60/ifconfig.c 2008-11-06 16:36:10.000000000 +0100
@@ -227,13 +227,13 @@
int main(int argc, char **argv)
{
- struct sockaddr sa;
+ struct sockaddr sa, sa_netmask;
struct sockaddr_in sin;
char host[128];
struct aftype *ap;
struct hwtype *hw;
struct ifreq ifr;
- int goterr = 0, didnetmask = 0;
+ int goterr = 0, didnetmask = 0, donetmask = 0;
char **spp;
int fd;
#if HAVE_AFINET6
@@ -903,7 +903,7 @@
/* FIXME: sa is too small for INET6 addresses, inet6 should use that too,
broadcast is unexpected */
if (ap->getmask) {
- switch (ap->getmask(host, &sa, NULL)) {
+ switch (ap->getmask(host, &sa_netmask, NULL)) {
case -1:
usage();
break;
@@ -911,8 +911,8 @@
if (didnetmask)
usage();
- goterr = set_netmask(skfd, &ifr, &sa);
- didnetmask++;
+ /* delay setting the CIDR netmask till after setting the addr */
+ donetmask = 1;
break;
}
}
@@ -960,6 +960,13 @@
}
}
+ /* set CIDR netmask */
+ if (donetmask) {
+ donetmask = 0;
+ goterr = set_netmask(skfd, &ifr, &sa_netmask);
+ didnetmask++;
+ }
+
/*
* Don't do the set_flag() if the address is an alias with a - at the
* end, since it's deleted already! - Roman