diff options
author | guy <guy> | 2005-01-29 10:34:04 +0000 |
---|---|---|
committer | guy <guy> | 2005-01-29 10:34:04 +0000 |
commit | 547b1dec365851d6bebcf3e445b310d2145ee978 (patch) | |
tree | 1925a630fc77b83a8964300bea771e84b82926ee /fad-gifc.c | |
parent | 2c2964501569c0a1480f45c3b3906648ada72531 (diff) | |
download | libpcap-547b1dec365851d6bebcf3e445b310d2145ee978.tar.gz |
Don't ignore Solaris logical interface entries, as they could give
additional IP addresses for the underlying interface; instead, strip off
the logical interface number, and add them so that the additional
addresses are added.
Diffstat (limited to 'fad-gifc.c')
-rw-r--r-- | fad-gifc.c | 54 |
1 files changed, 30 insertions, 24 deletions
@@ -34,7 +34,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/fad-gifc.c,v 1.7 2005-01-28 20:33:51 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/fad-gifc.c,v 1.8 2005-01-29 10:34:04 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -256,7 +256,7 @@ pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf) char *buf = NULL; unsigned buf_size; #ifdef HAVE_SOLARIS - char *p; + char *p, *q; #endif struct ifreq ifrflags, ifrnetmask, ifrbroadaddr, ifrdstaddr; struct sockaddr *netmask, *broadaddr, *dstaddr; @@ -348,28 +348,6 @@ pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf) if (strncmp(ifrp->ifr_name, "dummy", 5) == 0) continue; -#ifdef HAVE_SOLARIS - /* - * Skip entries that have a ":" followed by a number - * at the end - those are Solaris virtual interfaces - * on which you can't capture. - */ - p = strchr(ifrp->ifr_name, ':'); - if (p != NULL) { - /* - * We have a ":"; is it followed by a number? - */ - while (isdigit((unsigned char)*p)) - p++; - if (*p == '\0') { - /* - * All digits after the ":" until the end. - */ - continue; - } - } -#endif - /* * Get the flags for this interface, and skip it if it's * not up. @@ -496,6 +474,34 @@ pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf) dstaddr_size = 0; } +#ifdef HAVE_SOLARIS + /* + * If this entry has a colon followed by a number at + * the end, it's a logical interface. Those are just + * the way you assign multiple IP addresses to a real + * interface, so an entry for a logical interface should + * be treated like the entry for the real interface; + * we do that by stripping off the ":" and the number. + */ + p = strchr(ifrp->ifr_name, ':'); + if (p != NULL) { + /* + * We have a ":"; is it followed by a number? + */ + q = p + 1; + while (isdigit((unsigned char)*q)) + q++; + if (*q == '\0') { + /* + * All digits after the ":" until the end. + * Strip off the ":" and everything after + * it. + */ + *p = '\0'; + } + } +#endif + /* * Add information for this address to the list. */ |