Module Name: src
Committed By: seanb
Date: Fri Oct 26 16:52:52 UTC 2012
Modified Files:
src/usr.sbin/ifmcstat: ifmcstat.c
Log Message:
Ensure entire sockaddr_dl is obtained. May not have
been the case previously for interfaces with long names.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/usr.sbin/ifmcstat/ifmcstat.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.sbin/ifmcstat/ifmcstat.c
diff -u src/usr.sbin/ifmcstat/ifmcstat.c:1.10 src/usr.sbin/ifmcstat/ifmcstat.c:1.11
--- src/usr.sbin/ifmcstat/ifmcstat.c:1.10 Sun Apr 19 07:49:07 2009
+++ src/usr.sbin/ifmcstat/ifmcstat.c Fri Oct 26 16:52:52 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: ifmcstat.c,v 1.10 2009/04/19 07:49:07 lukem Exp $ */
+/* $NetBSD: ifmcstat.c,v 1.11 2012/10/26 16:52:52 seanb Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -140,7 +140,12 @@ int main()
struct arpcom arpcom;
#else
struct ethercom ec;
- struct sockaddr_dl sdl;
+ union {
+ struct sockaddr_storage st;
+ struct sockaddr_dl sdl;
+ } su;
+ struct sockaddr_dl *sdlp;
+ sdlp = &su.sdl;
#endif
if ((kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, buf)) == NULL) {
@@ -172,10 +177,13 @@ int main()
#endif
#ifdef __NetBSD__
- KREAD(ifnet.if_sadl, &sdl, struct sockaddr_dl);
- if (sdl.sdl_type == IFT_ETHER) {
+ KREAD(ifnet.if_sadl, sdlp, struct sockaddr_dl);
+ if (sdlp->sdl_type == IFT_ETHER) {
+ /* If we didn't get all of it, try again */
+ if (sdlp->sdl_len > sizeof(struct sockaddr_dl))
+ kread((u_long)ifnet.if_sadl, (void *)sdlp, sdlp->sdl_len);
printf("\tenaddr %s",
- ether_ntoa((struct ether_addr *)LLADDR(&sdl)));
+ ether_ntoa((struct ether_addr *)LLADDR(sdlp)));
KREAD(ifp, &ec, struct ethercom);
printf(" multicnt %d", ec.ec_multicnt);
acmc(ec.ec_multiaddrs.lh_first);