Module Name: src Committed By: christos Date: Wed Jul 13 22:01:12 UTC 2016
Modified Files: src/usr.bin/netstat: if.c Log Message: fix sysctl based interface printing, and annotate where we should add the missing multicast printing code. To generate a diff of this commit: cvs rdiff -u -r1.83 -r1.84 src/usr.bin/netstat/if.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/netstat/if.c diff -u src/usr.bin/netstat/if.c:1.83 src/usr.bin/netstat/if.c:1.84 --- src/usr.bin/netstat/if.c:1.83 Mon Feb 29 13:21:15 2016 +++ src/usr.bin/netstat/if.c Wed Jul 13 18:01:12 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if.c,v 1.83 2016/02/29 18:21:15 christos Exp $ */ +/* $NetBSD: if.c,v 1.84 2016/07/13 22:01:12 christos Exp $ */ /* * Copyright (c) 1983, 1988, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "from: @(#)if.c 8.2 (Berkeley) 2/21/94"; #else -__RCSID("$NetBSD: if.c,v 1.83 2016/02/29 18:21:15 christos Exp $"); +__RCSID("$NetBSD: if.c,v 1.84 2016/07/13 22:01:12 christos Exp $"); #endif #endif /* not lint */ @@ -177,6 +177,7 @@ intpr_sysctl(void) struct sockaddr_dl *sdl; uint64_t total = 0; size_t len; + int did = 1, rtax = 0, n; char name[IFNAMSIZ + 1]; /* + 1 for `*' */ if (prog_sysctl(mib, 6, NULL, &len, NULL, 0) == -1) @@ -233,11 +234,13 @@ intpr_sysctl(void) if (total == 0) continue; } - - printf("%-5s %-5" PRIu64, name, ifd->ifi_mtu); - print_addr(rti_info[RTAX_IFP], rti_info, ifd, NULL); + /* Skip the first one */ + if (did) { + did = 0; + continue; + } + rtax = RTAX_IFP; break; - case RTM_NEWADDR: if (qflag && total == 0) continue; @@ -251,11 +254,19 @@ intpr_sysctl(void) sa = (struct sockaddr *)(ifam + 1); get_rtaddrs(ifam->ifam_addrs, sa, rti_info); - - printf("%-5s %-5" PRIu64, name, ifd->ifi_mtu); - print_addr(rti_info[RTAX_IFA], rti_info, ifd, NULL); + rtax = RTAX_IFA; + did = 1; break; + default: + continue; } + if (vflag) + n = strlen(name) < 5 ? 5 : strlen(name); + else + n = 5; + + printf("%-*.*s %-5" PRIu64 " ", n, n, name, ifd->ifi_mtu); + print_addr(rti_info[rtax], rti_info, ifd, NULL); } } @@ -345,6 +356,29 @@ intpr_kvm(u_long ifnetaddr, void (*pfunc } static void +ia6_print(struct in6_addr *ia) +{ + struct sockaddr_in6 as6; + char hbuf[NI_MAXHOST]; /* for getnameinfo() */ + int n; + + memset(&as6, 0, sizeof(as6)); + as6.sin6_len = sizeof(struct sockaddr_in6); + as6.sin6_family = AF_INET6; + as6.sin6_addr = *ia; + inet6_getscopeid(&as6, INET6_IS_ADDR_MC_LINKLOCAL); + if (getnameinfo((struct sockaddr *)&as6, as6.sin6_len, hbuf, + sizeof(hbuf), NULL, 0, NI_NUMERICHOST) != 0) { + strlcpy(hbuf, "??", sizeof(hbuf)); + } + if (vflag) + n = strlen(hbuf) < 17 ? 17 : strlen(hbuf); + else + n = 17; + printf("\n%25s %-*.*s ", "", n, n, hbuf); +} + +static void print_addr(struct sockaddr *sa, struct sockaddr **rtinfo, struct if_data *ifd, struct ifnet *ifnet) { @@ -386,7 +420,9 @@ print_addr(struct sockaddr *sa, struct s n = 17; printf("%-*.*s ", n, n, cp); - if (aflag && ifnet) { + if (!aflag) + break; + if (ifnet) { u_long multiaddr; struct in_multi inm; union ifaddr_u *ifaddr = (union ifaddr_u *)rtinfo; @@ -402,6 +438,8 @@ print_addr(struct sockaddr *sa, struct s multiaddr = (u_long)inm.inm_list.le_next; } + } else { + // XXX: Sysctl/ioctl to get multicast addresses } break; #ifdef INET6 @@ -439,41 +477,21 @@ print_addr(struct sockaddr *sa, struct s n = 17; printf("%-*.*s ", n, n, cp); - if (aflag && ifnet) { + if (!aflag) + break; + if (ifnet) { u_long multiaddr; struct in6_multi inm; - struct sockaddr_in6 as6; union ifaddr_u *ifaddr = (union ifaddr_u *)rtinfo; - multiaddr = (u_long) - ifaddr->in6.ia6_multiaddrs.lh_first; + multiaddr = (u_long)ifaddr->in6.ia6_multiaddrs.lh_first; while (multiaddr != 0) { - kread(multiaddr, (char *)&inm, - sizeof inm); - memset(&as6, 0, sizeof(as6)); - as6.sin6_len = sizeof(struct sockaddr_in6); - as6.sin6_family = AF_INET6; - as6.sin6_addr = inm.in6m_addr; - inet6_getscopeid(&as6, - INET6_IS_ADDR_MC_LINKLOCAL); - if (getnameinfo((struct sockaddr *)&as6, - as6.sin6_len, hbuf, - sizeof(hbuf), NULL, 0, - niflag) != 0) { - strlcpy(hbuf, "??", - sizeof(hbuf)); - } - cp = hbuf; - if (vflag) - n = strlen(cp) < 17 - ? 17 : strlen(cp); - else - n = 17; - printf("\n%25s %-*.*s ", "", - n, n, cp); - multiaddr = - (u_long)inm.in6m_entry.le_next; + kread(multiaddr, (char *)&inm, sizeof inm); + ia6_print(&inm.in6m_addr); + multiaddr = (u_long)inm.in6m_entry.le_next; } + } else { + // XXX: Sysctl/ioctl to get multicast addresses } break; #endif /*INET6*/