interfaceiter.c revision 0c27b3fe77ac1d5094ba3521e8142d9e7973133f
/*
* Copyright (C) 1999-2005, 2007, 2008, 2014, 2016 Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/* $Id: interfaceiter.c,v 1.45 2008/12/01 03:51:47 marka 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.
*/
#ifdef __linux
#define ISC_IF_INET6_SZ \
sizeof("00000000000000000000000000000001 01 80 10 80 XXXXXXloXXXXXXXX\n")
#endif
#if HAVE_GETIFADDRS
#include "ifiter_getifaddrs.c"
#include "ifiter_sysctl.c"
#else
#include "ifiter_ioctl.c"
#endif
#ifdef __linux
static void
(void)linux_if_inet6_next(iter);
} else
}
static isc_result_t
else
}
static isc_result_t
char address[33];
int res;
unsigned int i;
return (ISC_R_FAILURE);
}
if (res != 6) {
res);
return (ISC_R_FAILURE);
}
return (ISC_R_FAILURE);
}
for (i = 0; i < 16; i++) {
unsigned char byte;
static const char hex[] = "0123456789abcdef";
}
}
for (i = 0; i < 16; i++) {
if (prefix > 8) {
prefix -= 8;
} else {
prefix = 0;
}
}
return (ISC_R_SUCCESS);
}
#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
{
}