aboutsummaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorHajimu UMEMOTO <ume@FreeBSD.org>2011-02-26 20:04:14 +0000
committerHajimu UMEMOTO <ume@FreeBSD.org>2011-02-26 20:04:14 +0000
commit37333a300a01dbe177b2d562532a424e8a75c814 (patch)
tree17d3a05200683d5a700aaa96eb33423bbe2de18d /usr.bin
parent1fea66bc13858ec6e155af7941389fb84ee447e8 (diff)
Notes
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/netstat/if.c24
-rw-r--r--usr.bin/netstat/netstat.h1
-rw-r--r--usr.bin/netstat/route.c31
3 files changed, 35 insertions, 21 deletions
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
index e02997e71815..1175fa9c0ee2 100644
--- a/usr.bin/netstat/if.c
+++ b/usr.bin/netstat/if.c
@@ -63,6 +63,9 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <errno.h>
#include <libutil.h>
+#ifdef INET6
+#include <netdb.h>
+#endif
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
@@ -79,7 +82,7 @@ static void sidewaysintpr(int, u_long);
static void catchalarm(int);
#ifdef INET6
-static char ntop_buf[INET6_ADDRSTRLEN]; /* for inet_ntop() */
+static char addr_buf[NI_MAXHOST]; /* for getnameinfo() */
#endif
/*
@@ -347,13 +350,14 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *))
#ifdef INET6
case AF_INET6:
sockin6 = (struct sockaddr_in6 *)sa;
+ in6_fillscopeid(&ifaddr.in6.ia_addr);
printf("%-13.13s ",
netname6(&ifaddr.in6.ia_addr,
&ifaddr.in6.ia_prefixmask.sin6_addr));
- printf("%-17.17s ",
- inet_ntop(AF_INET6,
- &sockin6->sin6_addr,
- ntop_buf, sizeof(ntop_buf)));
+ in6_fillscopeid(sockin6);
+ getnameinfo(sa, sa->sa_len, addr_buf,
+ sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
+ printf("%-17.17s ", addr_buf);
network_layer = 1;
break;
@@ -475,13 +479,13 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *))
break;
#ifdef INET6
case AF_INET6:
+ in6_fillscopeid(&msa.in6);
+ getnameinfo(&msa.sa, msa.sa.sa_len,
+ addr_buf, sizeof(addr_buf), 0, 0,
+ NI_NUMERICHOST);
printf("%*s %-19.19s(refs: %d)\n",
Wflag ? 27 : 25, "",
- inet_ntop(AF_INET6,
- &msa.in6.sin6_addr,
- ntop_buf,
- sizeof(ntop_buf)),
- ifma.ifma_refcount);
+ addr_buf, ifma.ifma_refcount);
break;
#endif /* INET6 */
case AF_LINK:
diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h
index 580af7c0c0eb..98a03893da20 100644
--- a/usr.bin/netstat/netstat.h
+++ b/usr.bin/netstat/netstat.h
@@ -106,6 +106,7 @@ void mrt6_stats(u_long);
struct sockaddr_in6;
struct in6_addr;
+void in6_fillscopeid(struct sockaddr_in6 *);
char *routename6(struct sockaddr_in6 *);
const char *netname6(struct sockaddr_in6 *, struct in6_addr *);
void inet6print(struct in6_addr *, int, const char *, int);
diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c
index 2e9e919f109b..42596460fbbe 100644
--- a/usr.bin/netstat/route.c
+++ b/usr.bin/netstat/route.c
@@ -637,18 +637,8 @@ fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags)
case AF_INET6:
{
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;
- struct in6_addr *in6 = &sa6->sin6_addr;
- /*
- * XXX: This is a special workaround for KAME kernels.
- * sin6_scope_id field of SA should be set in the future.
- */
- if (IN6_IS_ADDR_LINKLOCAL(in6) ||
- IN6_IS_ADDR_MC_LINKLOCAL(in6)) {
- /* XXX: override is ok? */
- sa6->sin6_scope_id = (u_int32_t)ntohs(*(u_short *)&in6->s6_addr[2]);
- *(u_short *)&in6->s6_addr[2] = 0;
- }
+ in6_fillscopeid(sa6);
if (flags & RTF_HOST)
cp = routename6(sa6);
@@ -899,6 +889,25 @@ netname(in_addr_t in, u_long mask)
#undef NSHIFT
#ifdef INET6
+void
+in6_fillscopeid(struct sockaddr_in6 *sa6)
+{
+#if defined(__KAME__)
+ /*
+ * XXX: This is a special workaround for KAME kernels.
+ * sin6_scope_id field of SA should be set in the future.
+ */
+ if (IN6_IS_ADDR_LINKLOCAL(&sa6->sin6_addr) ||
+ IN6_IS_ADDR_MC_NODELOCAL(&sa6->sin6_addr) ||
+ IN6_IS_ADDR_MC_LINKLOCAL(&sa6->sin6_addr)) {
+ /* XXX: override is ok? */
+ sa6->sin6_scope_id =
+ ntohs(*(u_int16_t *)&sa6->sin6_addr.s6_addr[2]);
+ sa6->sin6_addr.s6_addr[2] = sa6->sin6_addr.s6_addr[3] = 0;
+ }
+#endif
+}
+
const char *
netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)
{