Bug #803 » sbin.route.patch
sbin/route/route.c | ||
---|---|---|
rtm_addrs |= RTA_NETMASK;
|
||
if (net == 0)
|
||
mask = addr = 0;
|
||
else if (net < 128) {
|
||
addr = net << IN_CLASSA_NSHIFT;
|
||
mask = IN_CLASSA_NET;
|
||
} else if (net < 65536) {
|
||
addr = net << IN_CLASSB_NSHIFT;
|
||
mask = IN_CLASSB_NET;
|
||
} else if (net < 16777216L) {
|
||
addr = net << IN_CLASSC_NSHIFT;
|
||
mask = IN_CLASSC_NET;
|
||
} else {
|
||
addr = net;
|
||
if ((addr & IN_CLASSA_HOST) == 0)
|
||
mask = IN_CLASSA_NET;
|
||
else if ((addr & IN_CLASSB_HOST) == 0)
|
||
mask = IN_CLASSB_NET;
|
||
else if ((addr & IN_CLASSC_HOST) == 0)
|
||
mask = IN_CLASSC_NET;
|
||
else {
|
||
if (net <= 0xff)
|
||
addr = net << 24;
|
||
else if (net <= 0xffff)
|
||
addr = net << 16;
|
||
else if (net <= 0xffffff)
|
||
addr = net << 8;
|
||
else
|
||
mask = -1;
|
||
addr = net;
|
||
if (bits)
|
||
mask = 0xffffffff << (32 - bits);
|
||
else {
|
||
if (IN_CLASSA(addr)) {
|
||
mask = IN_CLASSA_NET;
|
||
} else if (IN_CLASSB(addr)) {
|
||
mask = IN_CLASSB_NET;
|
||
} else if (IN_CLASSC(addr)) {
|
||
mask = IN_CLASSC_NET;
|
||
} else
|
||
mask = 0xffffffff;
|
||
}
|
||
addr &= mask;
|
||
}
|
||
if (bits != 0)
|
||
mask = 0xffffffff << (32 - bits);
|
||
in->sin_addr.s_addr = htonl(addr);
|
||
in = &so_mask.sin;
|
||
in->sin_addr.s_addr = htonl(mask);
|