From fb9a5f335704f1cf85a5e9a16fe43ae1c52aa64b Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Sun, 24 May 2009 18:09:32 -0700 Subject: [PATCH] (SIGAR-142) loosen net_interface_list filters --- src/os/darwin/darwin_sigar.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/os/darwin/darwin_sigar.c b/src/os/darwin/darwin_sigar.c index faf8c5c5..b32e726b 100644 --- a/src/os/darwin/darwin_sigar.c +++ b/src/os/darwin/darwin_sigar.c @@ -2456,6 +2456,26 @@ static int sigar_ifmsg_init(sigar_t *sigar) return SIGAR_OK; } +static int has_ifaddr(char *name) +{ + int sock, status; + struct ifreq ifr; + + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + return errno; + } + SIGAR_SSTRCPY(ifr.ifr_name, name); + if (ioctl(sock, SIOCGIFADDR, &ifr) == 0) { + status = SIGAR_OK; + } + else { + status = errno; + } + + close(sock); + return status; +} + static int sigar_ifmsg_iter(sigar_t *sigar, ifmsg_iter_t *iter) { char *end = sigar->ifconf_buf + sigar->ifconf_len; @@ -2490,14 +2510,20 @@ static int sigar_ifmsg_iter(sigar_t *sigar, ifmsg_iter_t *iter) if (sdl->sdl_family != AF_LINK) { continue; } - if (!((sdl->sdl_type == IFT_ETHER) || - (sdl->sdl_type == IFT_LOOP))) - { - continue; /* XXX deal w/ other weirdo interfaces */ - } switch (iter->type) { case IFMSG_ITER_LIST: + if (sdl->sdl_type == IFT_OTHER) { + if (has_ifaddr(sdl->sdl_data) != SIGAR_OK) { + break; + } + } + else if (!((sdl->sdl_type == IFT_ETHER) || + (sdl->sdl_type == IFT_LOOP))) + { + break; /* XXX deal w/ other weirdo interfaces */ + } + SIGAR_NET_IFLIST_GROW(iter->data.iflist); /* sdl_data doesn't include a trailing \0, it is only sdl_nlen long */