summaryrefslogtreecommitdiffstats
path: root/sbin/route
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2012-11-14 08:05:21 +0000
committerglebius <glebius@FreeBSD.org>2012-11-14 08:05:21 +0000
commitb210c68711637745afda58b4b52726ddb91bfbf5 (patch)
tree04bd33f1dc52a0503bacf02f2d7190aa9ea424f4 /sbin/route
parenta6e954ad52b1147469282b780e34a6f630a1f778 (diff)
downloadFreeBSD-src-b210c68711637745afda58b4b52726ddb91bfbf5.zip
FreeBSD-src-b210c68711637745afda58b4b52726ddb91bfbf5.tar.gz
Remove remnants of classful addressing. These magic transformations
of supplied arguments is not what a modern sysadmin expect.
Diffstat (limited to 'sbin/route')
-rw-r--r--sbin/route/route.c49
1 files changed, 8 insertions, 41 deletions
diff --git a/sbin/route/route.c b/sbin/route/route.c
index 717a09a..f81d7a8 100644
--- a/sbin/route/route.c
+++ b/sbin/route/route.c
@@ -422,7 +422,7 @@ routename(struct sockaddr *sa)
/*
* Return the name of the network whose address is given.
- * The address is assumed to be that of a net or subnet, not a host.
+ * The address is assumed to be that of a net, not a host.
*/
const char *
netname(struct sockaddr *sa)
@@ -430,9 +430,8 @@ netname(struct sockaddr *sa)
const char *cp = NULL;
static char line[MAXHOSTNAMELEN + 1];
struct netent *np = NULL;
- u_long net, mask;
u_long i;
- int n, subnetshift;
+ int n;
switch (sa->sa_family) {
@@ -444,28 +443,7 @@ netname(struct sockaddr *sa)
if (in.s_addr == 0)
cp = "default";
else if (!nflag) {
- if (IN_CLASSA(i)) {
- mask = IN_CLASSA_NET;
- subnetshift = 8;
- } else if (IN_CLASSB(i)) {
- mask = IN_CLASSB_NET;
- subnetshift = 8;
- } else {
- mask = IN_CLASSC_NET;
- subnetshift = 4;
- }
- /*
- * If there are more bits than the standard mask
- * would suggest, subnets must be in use.
- * Guess at the subnet mask, assuming reasonable
- * width subnet fields.
- */
- while (in.s_addr & ~mask)
- mask |= mask >> subnetshift;
- net = in.s_addr & mask;
- while ((mask & 1) == 0)
- mask >>= 1, net >>= 1;
- np = getnetbyaddr(net, AF_INET);
+ np = getnetbyaddr(i, AF_INET);
if (np != NULL)
cp = np->n_name;
}
@@ -810,30 +788,19 @@ newroute(int argc, char **argv)
static void
inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits)
{
- u_long addr, mask = 0;
+ u_long mask = 0;
char *cp;
rtm_addrs |= RTA_NETMASK;
- /*
- * XXX: This approach unable to handle 0.0.0.1/32 correctly
- * as inet_network() converts 0.0.0.1 and 1 equally.
- */
- if (net <= 0xff)
- addr = net << IN_CLASSA_NSHIFT;
- else if (net <= 0xffff)
- addr = net << IN_CLASSB_NSHIFT;
- else if (net <= 0xffffff)
- addr = net << IN_CLASSC_NSHIFT;
- else
- addr = net;
+
/*
* If no /xx was specified we must calculate the
* CIDR address.
*/
- if ((bits == 0) && (addr != 0)) {
+ if ((bits == 0) && (net != 0)) {
u_long i, j;
for(i=0,j=0xff; i<4; i++) {
- if (addr & j) {
+ if (net & j) {
break;
}
j <<= 8;
@@ -844,7 +811,7 @@ inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits)
if (bits != 0)
mask = 0xffffffff << (32 - bits);
- sin->sin_addr.s_addr = htonl(addr);
+ sin->sin_addr.s_addr = htonl(net);
sin = &so_mask.sin;
sin->sin_addr.s_addr = htonl(mask);
sin->sin_len = 0;
OpenPOWER on IntegriCloud