interfaceiter.c revision 70e5a7403f0e0a3bd292b8287c5fed5772c15270
/*
* Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: interfaceiter.c,v 1.42 2007/06/19 23:47:18 tbox Exp $ */
/*! \file */
#include <config.h>
#ifdef HAVE_SYS_SOCKIO_H
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <isc/interfaceiter.h>
#include <isc/strerror.h>
#ifdef HAVE_NET_IF6_H
#endif
/* Common utility functions */
/*%
* Extract the network address part from a "struct sockaddr".
* \brief
* The address family is given explicitly
* instead of using src->sa_family, because the latter does not work
* for copying a network mask obtained by SIOCGIFNETMASK (it does
* not have a valid address family).
*/
static void
char *ifname)
{
struct sockaddr_in6 *sa6;
#if !defined(ISC_PLATFORM_HAVEIFNAMETOINDEX) || \
!defined(ISC_PLATFORM_HAVESCOPEID)
#endif
/* clear any remaining value for safety */
switch (family) {
case AF_INET:
sizeof(struct in_addr));
break;
case AF_INET6:
sizeof(struct in6_addr));
#ifdef ISC_PLATFORM_HAVESCOPEID
if (sa6->sin6_scope_id != 0)
else {
/*
* BSD variants embed scope zone IDs in the 128bit
* address as a kernel internal form. Unfortunately,
* the embedded IDs are not hidden from applications
* when getting access to them by sysctl or ioctl.
* We convert the internal format to the pure address
* part and the zone ID part.
* Since multicast addresses should not appear here
* and they cannot be distinguished from netmasks,
* we only consider unicast link-local addresses.
*/
sizeof(zone16));
if (zone16 != 0) {
/* the zone ID is embedded */
unsigned int zone;
/*
* sin6_scope_id is still not provided,
* but the corresponding interface name
* is know. Use the interface ID as
* the link ID.
*/
if (zone != 0) {
(isc_uint32_t)zone);
}
#endif
}
}
}
#endif
break;
default:
INSIST(0);
break;
}
}
/*
* Include system-dependent code.
*/
#if HAVE_GETIFADDRS
#include "ifiter_getifaddrs.c"
#include "ifiter_sysctl.c"
#else
#include "ifiter_ioctl.c"
#endif
/*
* The remaining code is common to the sysctl and ioctl case.
*/
{
return (ISC_R_SUCCESS);
}
for (;;) {
if (result != ISC_R_IGNORE)
break;
if (result != ISC_R_SUCCESS)
break;
}
return (result);
}
for (;;) {
if (result != ISC_R_SUCCESS)
break;
if (result != ISC_R_IGNORE)
break;
}
return (result);
}
void
{
}