summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorfenner <fenner@FreeBSD.org>1996-12-02 06:38:30 +0000
committerfenner <fenner@FreeBSD.org>1996-12-02 06:38:30 +0000
commita9efebe64e5d894efc31d901780a1a683983e0e4 (patch)
tree87eefeb897ddfd7e8f76a191f960057456b7c3ea /usr.bin
parentfa31e27204e6707a36d8c9001559c1996203ce72 (diff)
downloadFreeBSD-src-a9efebe64e5d894efc31d901780a1a683983e0e4.zip
FreeBSD-src-a9efebe64e5d894efc31d901780a1a683983e0e4.tar.gz
Display multicast addresses if the "a" flag is used in combination
with "-i". This was already in the man page but was not implemented. Obtained from: Multicast release 3.5
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/netstat/if.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
index f09e72e..6c9db22 100644
--- a/usr.bin/netstat/if.c
+++ b/usr.bin/netstat/if.c
@@ -41,8 +41,12 @@ static char sccsid[] = "@(#)if.c 8.3 (Berkeley) 4/28/95";
#include <net/if.h>
#include <net/if_dl.h>
+#include <net/if_types.h>
#include <netinet/in.h>
#include <netinet/in_var.h>
+#define KERNEL 1
+#include <netinet/if_ether.h>
+#undef KERNEL
#include <netipx/ipx.h>
#include <netipx/ipx_if.h>
#ifdef NS
@@ -89,6 +93,8 @@ intpr(interval, ifnetaddr)
#endif
} ifaddr;
u_long ifaddraddr;
+ u_long ifaddrfound;
+ u_long ifnetfound;
struct sockaddr *sa;
char name[32], tname[16];
@@ -122,6 +128,7 @@ intpr(interval, ifnetaddr)
int n, m;
if (ifaddraddr == 0) {
+ ifnetfound = ifnetaddr;
if (kread(ifnetaddr, (char *)&ifnet, sizeof ifnet) ||
kread((u_long)ifnet.if_name, tname, 16))
return;
@@ -137,6 +144,7 @@ intpr(interval, ifnetaddr)
ifaddraddr = (u_long)ifnet.if_addrlist;
}
printf("%-5.5s %-5lu ", name, ifnet.if_mtu);
+ ifaddrfound = ifaddraddr;
if (ifaddraddr == 0) {
printf("%-13.13s ", "none");
printf("%-15.15s ", "none");
@@ -248,6 +256,58 @@ intpr(interval, ifnetaddr)
if (dflag)
printf(" %3d", ifnet.if_snd.ifq_drops);
putchar('\n');
+ if (aflag && ifaddrfound) {
+ /*
+ * Print family's multicast addresses
+ */
+ switch (sa->sa_family) {
+ case AF_INET:
+ {
+ u_long multiaddr;
+ struct in_multi inm;
+
+ multiaddr = (u_long)ifaddr.in.ia_multiaddrs.lh_first;
+ while (multiaddr != 0) {
+ kread(multiaddr, (char *)&inm,
+ sizeof inm);
+ multiaddr = (u_long)inm.inm_entry.le_next;
+ printf("%23s %s\n", "",
+ routename(inm.inm_addr.s_addr));
+ }
+ break;
+ }
+ case AF_LINK:
+ switch (ifnet.if_type) {
+ case IFT_ETHER:
+ case IFT_FDDI: /*XXX*/
+ {
+ off_t multiaddr;
+ struct arpcom ac;
+ struct ether_multi enm;
+
+ kread(ifnetfound, (char *)&ac, sizeof ac);
+ multiaddr = (u_long)ac.ac_multiaddrs;
+ while (multiaddr != 0) {
+ kread(multiaddr, (char *)&enm,
+ sizeof enm);
+ multiaddr = (u_long)enm.enm_next;
+ printf("%23s %s", "",
+ ether_ntoa(&enm.enm_addrlo));
+ if (bcmp(&enm.enm_addrlo,
+ &enm.enm_addrhi, 6) != 0)
+ printf(" to %s",
+ ether_ntoa(&enm.enm_addrhi));
+ printf("\n");
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ }
}
}
OpenPOWER on IntegriCloud