Make sure that a netmask socket address value prints appropriately when the

family is unset.  Either the destination or interface address socket address
family value is used.  This change prevents the following sort of output:

RTM_NEWADDR: address being added to iface: len 60, metric 0, flags:<UP>
sockaddrs: <NETMASK,IFA,BRD>
 (0) 00.00.ff.00.00 127.0.0.1 127.0.0.1

With this change the last line becomes:

 255.0.0.0 127.0.0.1 127.0.0.1

Also make sure that when using a generated inet netmask the address family
is set.  With this change a generated netmask will print appropriately
when using the verbose (-v) option.
This commit is contained in:
ginsbach 2005-08-15 19:28:08 +00:00
parent aef258e0aa
commit 6e420616a8
2 changed files with 54 additions and 25 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: extern.h,v 1.5 2005/08/09 21:25:42 ginsbach Exp $ */
/* $NetBSD: extern.h,v 1.6 2005/08/15 19:28:08 ginsbach Exp $ */
/*
* Copyright (c) 1997 Christos Zoulas. All rights reserved.
@ -44,7 +44,7 @@ extern int nflag;
#define NOTDEFSTRING "0.0.0.0/xxx.xxx.xxx.xxx\0"
int keyword(char *);
int netmask_length(struct sockaddr *, int);
char *netmask_string(struct sockaddr *, int);
char *netmask_string(struct sockaddr *, int, int);
const char *routename(struct sockaddr *, struct sockaddr *, int);
const char *netname(struct sockaddr *, struct sockaddr *);
const char *ns_print(struct sockaddr_ns *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: route.c,v 1.90 2005/08/12 21:23:06 ginsbach Exp $ */
/* $NetBSD: route.c,v 1.91 2005/08/15 19:28:08 ginsbach Exp $ */
/*
* Copyright (c) 1983, 1989, 1991, 1993
@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 1989, 1991, 1993\n\
#if 0
static char sccsid[] = "@(#)route.c 8.6 (Berkeley) 4/28/95";
#else
__RCSID("$NetBSD: route.c,v 1.90 2005/08/12 21:23:06 ginsbach Exp $");
__RCSID("$NetBSD: route.c,v 1.91 2005/08/15 19:28:08 ginsbach Exp $");
#endif
#endif /* not lint */
@ -451,19 +451,31 @@ netmask_length(struct sockaddr *nm, int family)
}
char *
netmask_string(struct sockaddr *mask, int len)
netmask_string(struct sockaddr *mask, int len, int family)
{
static char smask[16];
static char smask[INET6_ADDRSTRLEN];
struct sockaddr_in nsin;
struct sockaddr_in6 nsin6;
if (len >= 0)
snprintf(smask, sizeof(smask), "%d", len);
else {
/* XXX AF_INET only?! */
struct sockaddr_in nsin;
memset(&nsin, 0, sizeof(nsin));
memcpy(&nsin, mask, mask->sa_len);
snprintf(smask, sizeof(smask), "%s", inet_ntoa(nsin.sin_addr));
switch (family) {
case AF_INET:
memset(&nsin, 0, sizeof(nsin));
memcpy(&nsin, mask, mask->sa_len);
snprintf(smask, sizeof(smask), "%s",
inet_ntoa(nsin.sin_addr));
break;
case AF_INET6:
memset(&nsin6, 0, sizeof(nsin6));
memcpy(&nsin6, mask, mask->sa_len);
inet_ntop(family, &nsin6.sin6_addr, smask,
sizeof(smask));
break;
default:
snprintf(smask, sizeof(smask), "%s", any_ntoa(mask));
}
}
return smask;
@ -509,7 +521,8 @@ routename(struct sockaddr *sa, struct sockaddr *nm, int flags)
static char notdefault[sizeof(NOTDEFSTRING)];
snprintf(notdefault, sizeof(notdefault),
"0.0.0.0/%s", netmask_string(nm, nml));
"0.0.0.0/%s",
netmask_string(nm, nml, AF_INET));
cp = notdefault;
}
}
@ -633,7 +646,8 @@ netname(struct sockaddr *sa, struct sockaddr *nm)
static char notdefault[sizeof(NOTDEFSTRING)];
snprintf(notdefault, sizeof(notdefault),
"0.0.0.0/%s", netmask_string(nm, nml));
"0.0.0.0/%s",
netmask_string(nm, nml, AF_INET));
cp = notdefault;
}
}
@ -1091,6 +1105,7 @@ inet_makenetandmask(u_int32_t net, struct sockaddr_in *isin)
while (*--cp == 0 && cp > (char *)isin)
;
isin->sin_len = 1 + cp - (char *)isin;
isin->sin_family = AF_INET;
}
#ifdef INET6
@ -1718,7 +1733,7 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen)
switch (rtm->rtm_type) {
case RTM_IFINFO:
ifm = (struct if_msghdr *)rtm;
(void)printf("if# %d, %s, flags:", ifm->ifm_index,
(void)printf("if# %d, %s, flags: ", ifm->ifm_index,
#ifdef SMALL
""
#else
@ -1731,7 +1746,7 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen)
case RTM_NEWADDR:
case RTM_DELADDR:
ifam = (struct ifa_msghdr *)rtm;
(void)printf("metric %d, flags:", ifam->ifam_metric);
(void)printf("metric %d, flags: ", ifam->ifam_metric);
bprintf(stdout, ifam->ifam_flags, routeflags);
pmsg_addrs((char *)(ifam + 1), ifam->ifam_addrs);
break;
@ -1819,7 +1834,7 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen)
printf("\n");
break;
default:
(void)printf("pid: %d, seq %d, errno %d, flags:",
(void)printf("pid %d, seq %d, errno %d, flags: ",
rtm->rtm_pid, rtm->rtm_seq, rtm->rtm_errno);
bprintf(stdout, rtm->rtm_flags, routeflags);
pmsg_common(rtm);
@ -1962,20 +1977,34 @@ pmsg_common(struct rt_msghdr *rtm)
static void
pmsg_addrs(char *cp, int addrs)
{
struct sockaddr *sa;
int i;
struct sockaddr *sa[RTAX_MAX];
int i, nmf;
if (addrs != 0) {
(void)printf("\nsockaddrs: ");
bprintf(stdout, addrs, addrnames);
(void)putchar('\n');
for (i = 1; i; i <<= 1)
if (i & addrs) {
sa = (struct sockaddr *)cp;
(void)printf(" %s",
routename(sa, NULL, RTF_HOST));
ADVANCE(cp, sa);
nmf = -1;
for (i = 0; i < RTAX_MAX; i++) {
if ((1 << i) & addrs) {
sa[i] = (struct sockaddr *)cp;
if ((i == RTAX_DST || i == RTAX_IFA) &&
nmf == -1)
nmf = sa[i]->sa_family;
ADVANCE(cp, sa[i]);
} else
sa[i] = NULL;
}
for (i = 0; i < RTAX_MAX; i++) {
if (sa[i] != NULL) {
if (i == RTAX_NETMASK && sa[i]->sa_len)
(void)printf(" %s",
netmask_string(sa[i], -1, nmf));
else
(void)printf(" %s",
routename(sa[i], NULL, RTF_HOST));
}
}
}
(void)putchar('\n');
(void)fflush(stdout);