Module Name: src Committed By: dyoung Date: Tue Apr 21 22:46:40 UTC 2009
Modified Files: src/sbin/ifconfig: af_link.c ifconfig.c util.c util.h Log Message: To make sure that we always print the active link-layer address in the 'address: ' field, don't treat the first address as the active address, but search the link-layer addresses for the ones flagged IFLR_ACTIVE, and print those. Extract a subroutine, print_link_addresses(), for printing link-layer addresses. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sbin/ifconfig/af_link.c cvs rdiff -u -r1.217 -r1.218 src/sbin/ifconfig/ifconfig.c cvs rdiff -u -r1.9 -r1.10 src/sbin/ifconfig/util.c cvs rdiff -u -r1.6 -r1.7 src/sbin/ifconfig/util.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/ifconfig/af_link.c diff -u src/sbin/ifconfig/af_link.c:1.5 src/sbin/ifconfig/af_link.c:1.6 --- src/sbin/ifconfig/af_link.c:1.5 Tue Apr 21 21:42:35 2009 +++ src/sbin/ifconfig/af_link.c Tue Apr 21 22:46:39 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: af_link.c,v 1.5 2009/04/21 21:42:35 dyoung Exp $ */ +/* $NetBSD: af_link.c,v 1.6 2009/04/21 22:46:39 dyoung Exp $ */ /*- * Copyright (c) 2008 David Young. All rights reserved. @@ -27,7 +27,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: af_link.c,v 1.5 2009/04/21 21:42:35 dyoung Exp $"); +__RCSID("$NetBSD: af_link.c,v 1.6 2009/04/21 22:46:39 dyoung Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -74,53 +74,7 @@ static void link_status(prop_dictionary_t env, prop_dictionary_t oenv, bool force) { - char hbuf[NI_MAXHOST]; - const char *ifname; - int s; - struct ifaddrs *ifa, *ifap; - const struct sockaddr_dl *sdl; - struct if_laddrreq iflr; - - if ((ifname = getifname(env)) == NULL) - err(EXIT_FAILURE, "%s: getifname", __func__); - - if ((s = getsock(AF_LINK)) == -1) - err(EXIT_FAILURE, "%s: getsock", __func__); - - if (getifaddrs(&ifap) == -1) - err(EXIT_FAILURE, "%s: getifaddrs", __func__); - - memset(&iflr, 0, sizeof(iflr)); - - strlcpy(iflr.iflr_name, ifname, sizeof(iflr.iflr_name)); - - for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { - if (strcmp(ifname, ifa->ifa_name) != 0) - continue; - if (ifa->ifa_addr->sa_family != AF_LINK) - continue; - if (ifa->ifa_data != NULL) - continue; - - sdl = satocsdl(ifa->ifa_addr); - - memcpy(&iflr.addr, ifa->ifa_addr, MIN(ifa->ifa_addr->sa_len, - sizeof(iflr.addr))); - iflr.flags = IFLR_PREFIX; - iflr.prefixlen = sdl->sdl_alen * NBBY; - - if (ioctl(s, SIOCGLIFADDR, &iflr) == -1) - err(EXIT_FAILURE, "%s: ioctl", __func__); - - if ((iflr.flags & IFLR_ACTIVE) != 0) - continue; - - if (getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len, - hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST) == 0 && - hbuf[0] != '\0') - printf("\tlink %s\n", hbuf); - } - freeifaddrs(ifap); + print_link_addresses(env, false); } static int Index: src/sbin/ifconfig/ifconfig.c diff -u src/sbin/ifconfig/ifconfig.c:1.217 src/sbin/ifconfig/ifconfig.c:1.218 --- src/sbin/ifconfig/ifconfig.c:1.217 Tue Apr 21 22:13:10 2009 +++ src/sbin/ifconfig/ifconfig.c Tue Apr 21 22:46:39 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: ifconfig.c,v 1.217 2009/04/21 22:13:10 dyoung Exp $ */ +/* $NetBSD: ifconfig.c,v 1.218 2009/04/21 22:46:39 dyoung Exp $ */ /*- * Copyright (c) 1997, 1998, 2000 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ #ifndef lint __COPYRIGHT("@(#) Copyright (c) 1983, 1993\ The Regents of the University of California. All rights reserved."); -__RCSID("$NetBSD: ifconfig.c,v 1.217 2009/04/21 22:13:10 dyoung Exp $"); +__RCSID("$NetBSD: ifconfig.c,v 1.218 2009/04/21 22:46:39 dyoung Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -1152,7 +1152,6 @@ statistics_func_t *statistics_f; struct ifdatareq ifdr; struct ifreq ifr; - char hbuf[NI_MAXHOST]; char fbuf[BUFSIZ]; int af, s; const char *ifname; @@ -1202,11 +1201,7 @@ SIMPLEQ_FOREACH(status_f, &status_funcs, f_next) (*status_f->f_func)(env, oenv); - if (sdl != NULL && - getnameinfo(sdl, sdl->sa_len, - hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST) == 0 && - hbuf[0] != '\0') - printf("\taddress: %s\n", hbuf); + print_link_addresses(env, true); media_status(env, oenv); Index: src/sbin/ifconfig/util.c diff -u src/sbin/ifconfig/util.c:1.9 src/sbin/ifconfig/util.c:1.10 --- src/sbin/ifconfig/util.c:1.9 Sun Jan 18 00:24:29 2009 +++ src/sbin/ifconfig/util.c Tue Apr 21 22:46:39 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: util.c,v 1.9 2009/01/18 00:24:29 lukem Exp $ */ +/* $NetBSD: util.c,v 1.10 2009/04/21 22:46:39 dyoung Exp $ */ /*- * Copyright (c) 2008 David Young. All rights reserved. @@ -27,12 +27,13 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: util.c,v 1.9 2009/01/18 00:24:29 lukem Exp $"); +__RCSID("$NetBSD: util.c,v 1.10 2009/04/21 22:46:39 dyoung Exp $"); #endif /* not lint */ #include <ctype.h> #include <err.h> #include <errno.h> +#include <netdb.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> @@ -40,9 +41,14 @@ #include <unistd.h> #include <util.h> +#include <sys/param.h> +#include <sys/types.h> #include <sys/socket.h> +#include <ifaddrs.h> + #include <sys/ioctl.h> #include <net/if.h> +#include <net/if_dl.h> #include <netinet/in.h> /* XXX */ #include "env.h" @@ -230,6 +236,60 @@ return direct_ioctl(env, cmd, &ifr); } +void +print_link_addresses(prop_dictionary_t env, bool print_active_only) +{ + char hbuf[NI_MAXHOST]; + const char *ifname; + int s; + struct ifaddrs *ifa, *ifap; + const struct sockaddr_dl *sdl; + struct if_laddrreq iflr; + + if ((ifname = getifname(env)) == NULL) + err(EXIT_FAILURE, "%s: getifname", __func__); + + if ((s = getsock(AF_LINK)) == -1) + err(EXIT_FAILURE, "%s: getsock", __func__); + + if (getifaddrs(&ifap) == -1) + err(EXIT_FAILURE, "%s: getifaddrs", __func__); + + memset(&iflr, 0, sizeof(iflr)); + + strlcpy(iflr.iflr_name, ifname, sizeof(iflr.iflr_name)); + + for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { + if (strcmp(ifname, ifa->ifa_name) != 0) + continue; + if (ifa->ifa_addr->sa_family != AF_LINK) + continue; + if (ifa->ifa_data != NULL) + continue; + + sdl = satocsdl(ifa->ifa_addr); + + memcpy(&iflr.addr, ifa->ifa_addr, MIN(ifa->ifa_addr->sa_len, + sizeof(iflr.addr))); + iflr.flags = IFLR_PREFIX; + iflr.prefixlen = sdl->sdl_alen * NBBY; + + if (ioctl(s, SIOCGLIFADDR, &iflr) == -1) + err(EXIT_FAILURE, "%s: ioctl", __func__); + + if (((iflr.flags & IFLR_ACTIVE) != 0) != print_active_only) + continue; + + if (getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len, + hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST) == 0 && + hbuf[0] != '\0') { + printf("\t%s %s\n", + print_active_only ? "address:" : "link", hbuf); + } + } + freeifaddrs(ifap); +} + #ifdef INET6 /* KAME idiosyncrasy */ void Index: src/sbin/ifconfig/util.h diff -u src/sbin/ifconfig/util.h:1.6 src/sbin/ifconfig/util.h:1.7 --- src/sbin/ifconfig/util.h:1.6 Wed Jul 2 07:44:15 2008 +++ src/sbin/ifconfig/util.h Tue Apr 21 22:46:39 2009 @@ -13,6 +13,7 @@ SIMPLEQ_ENTRY(afswtch) af_next; }; +void print_link_addresses(prop_dictionary_t, bool); const char *get_string(const char *, const char *, u_int8_t *, int *); const struct afswtch *lookup_af_byname(const char *); const struct afswtch *lookup_af_bynum(int);