Exemple #1
0
int
getifaddrs(struct ifaddrs **ifap)
{
	int ret = -1;

	errno = ENXIO;

#if defined(PF_INET6) && defined(SIOCGIF6CONF) && defined(SIOCGIF6FLAGS)
	if (ret)
		ret = getifaddrs2(ifap, PF_INET6, SIOCGIF6CONF, SIOCGIF6FLAGS,
				  sizeof(struct in6_ifreq));
#endif
#if defined(CONFIG_IPV6) && defined(SIOCGIFCONF)
	if (ret)
		ret = getifaddrs2(ifap, PF_INET6, SIOCGIFCONF, SIOCGIFFLAGS,
				  sizeof(struct ifreq));
#endif
#if defined(PF_INET) && defined(SIOCGIFCONF) && defined(SIOCGIFFLAGS)
	if (ret)
		ret = getifaddrs2(ifap, PF_INET, SIOCGIFCONF, SIOCGIFFLAGS,
				  sizeof(struct ifreq));
#endif

	return ret;
}
Exemple #2
0
int
main()
{
    struct ifaddrs *a = NULL, *b;
    getifaddrs2(&a, AF_INET, SIOCGIFCONF, SIOCGIFFLAGS, sizeof(struct ifreq));
    print_ifaddrs(a);
    printf("---\n");
    getifaddrs(&b);
    print_ifaddrs(b);
    return 0;
}
Exemple #3
0
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
rk_getifaddrs(struct ifaddrs **ifap)
{
    int ret = -1;
    errno = ENXIO;
#if defined(AF_INET6) && defined(SIOCGIF6CONF) && defined(SIOCGIF6FLAGS)
    if (ret)
	ret = getifaddrs2 (ifap, AF_INET6, SIOCGIF6CONF, SIOCGIF6FLAGS,
			   sizeof(struct in6_ifreq));
#endif
#if defined(HAVE_IPV6) && defined(SIOCGLIFCONF) && defined(SIOCGLIFFLAGS)
    /* Do IPv6 and IPv4 queries separately then join the result.
     *
     * HP-UX only returns IPv6 addresses using SIOCGLIFCONF,
     * SIOCGIFCONF has to be used for IPv4 addresses. The result is then
     * merged.
     *
     * Solaris needs particular care, because a SIOCGLIFCONF lookup using
     * AF_UNSPEC can fail in a Zone requiring an AF_INET lookup, so we just
     * do them separately the same as for HP-UX. See
     * http://repo.or.cz/w/heimdal.git/commitdiff/76afc31e9ba2f37e64c70adc006ade9e37e9ef73
     */
    if (ret) {
	int v6err, v4err;
	struct ifaddrs *v6addrs, *v4addrs;

	v6err = getlifaddrs2 (&v6addrs, AF_INET6, SIOCGLIFCONF, SIOCGLIFFLAGS,
			    sizeof(struct lifreq));
	v4err = getifaddrs2 (&v4addrs, AF_INET, SIOCGIFCONF, SIOCGIFFLAGS,
			    sizeof(struct ifreq));
	if (v6err)
	    v6addrs = NULL;
	if (v4err)
	    v4addrs = NULL;

	if (v6addrs) {
	    if (v4addrs)
		*ifap = append_ifaddrs(v6addrs, v4addrs);
	    else
		*ifap = v6addrs;
	} else if (v4addrs) {
	    *ifap = v4addrs;
	} else {
	    *ifap = NULL;
	}

	ret = (v6err || v4err) ? -1 : 0;
    }
#endif
#if defined(HAVE_IPV6) && defined(SIOCGIFCONF)
    if (ret)
	ret = getifaddrs2 (ifap, AF_INET6, SIOCGIFCONF, SIOCGIFFLAGS,
			   sizeof(struct ifreq));
#endif
#if defined(AF_INET) && defined(SIOCGIFCONF) && defined(SIOCGIFFLAGS)
    if (ret)
	ret = getifaddrs2 (ifap, AF_INET, SIOCGIFCONF, SIOCGIFFLAGS,
			   sizeof(struct ifreq));
#endif
    return ret;
}