ifiter_ioctl.c revision b0196673ab41b4f17e1c45fba160f3ea2623a06f
573d78f3d53859bc01ce5d5cebbaac9b8b90bfbaTinderbox User * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * Copyright (C) 1999-2003 Internet Software Consortium.
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater * Permission to use, copy, modify, and distribute this software for any
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson * purpose with or without fee is hereby granted, provided that the above
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson * copyright notice and this permission notice appear in all copies.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * PERFORMANCE OF THIS SOFTWARE.
313b4dc3b2e2be29994ce030c42c39c9eef9c46bAutomatic Updater/* $Id: ifiter_ioctl.c,v 1.49 2004/06/22 05:25:49 marka Exp $ */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence * Obtain the list of network interfaces using the SIOCGLIFCONF ioctl.
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson * See netintro(4).
69f3cb5abcb38f105c653c7b3df7cec33b87b292Mark Andrews#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR)
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson#define IFITER_MAGIC ISC_MAGIC('I', 'F', 'I', 'T')
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson#define VALID_IFITER(t) ISC_MAGIC_VALID(t, IFITER_MAGIC)
df925e6c66d45d960fbac0383169763967d2111cEvan Hunt sizeof("00000000000000000000000000000001 01 80 10 80 XXXXXXloXXXXXXXX\n")
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews SIOCGIFCONF data */
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson SIOCGLIFCONF data */
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_result_t result6; /* Last result code. */
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence int clua_context; /* Cluster alias context */
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_interface_t current; /* Current interface data. */
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_result_t result; /* Last result code. */
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * Size of buffer for SIOCGLIFCONF, in bytes. We assume no sane system
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * will have more than a megabyte of interface configuration data.
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson iter->buf = isc_mem_get(iter->mctx, iter->bufsize);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson memset(&iter->ifc.ifc_len, 0, sizeof(iter->ifc.ifc_len));
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson * Ignore the HP/UX warning about "interger overflow during
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * conversion". It comes from its own macro definition,
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * and is really hard to shut up.
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson if (ioctl(iter->socket, SIOCGIFCONF, (char *)&iter->ifc)
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc__strerror(errno, strbuf, sizeof(strbuf));
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "get interface "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "configuration: %s"),
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * EINVAL. Retry with a bigger buffer.
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * The ioctl succeeded.
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * Some OS's just return what will fit rather
e80f661db8ec9596eb977d6fc537484aa3662e22Evan Hunt * than set EINVAL if the buffer is too small
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * to fit all the interfaces in. If
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * ifc.lifc_len is too near to the end of the
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * buffer we will grow it just in case and
cdbb3d27740fd052f18067b937097ebf35df356bAutomatic Updater if (iter->ifc.ifc_len + 2 * sizeof(struct ifreq)
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "get interface "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "configuration: "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "maximum buffer "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "size exceeded"));
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt isc_mem_put(iter->mctx, iter->buf, iter->bufsize);
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews isc_mem_put(iter->mctx, iter->buf, iter->bufsize);
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR)
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson iter->buf6 = isc_mem_get(iter->mctx, iter->bufsize6);
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * Ignore the HP/UX warning about "interger overflow during
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * conversion". It comes from its own macro definition,
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * and is really hard to shut up.
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews if (ioctl(iter->socket6, SIOCGLIFCONF, (char *)&iter->lifc)
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * IPv6 interface scanning is not available on all
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * kernels w/ IPv6 sockets.
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "get interface "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "configuration: %s"),
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson "get interface "
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence "configuration: %s"),
114c14f8adfc249cf2e5cdcb9007af46fed257e3Mark Andrews * EINVAL. Retry with a bigger buffer.
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * The ioctl succeeded.
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * Some OS's just return what will fit rather
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * than set EINVAL if the buffer is too small
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * to fit all the interfaces in. If
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * ifc.ifc_len is too near to the end of the
aeadcd63196f164b219629a53c0e0925519288f3Evan Hunt * buffer we will grow it just in case and
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson if (iter->lifc.lifc_len + 2 * sizeof(struct LIFREQ)
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson if (iter->bufsize6 >= IFCONF_BUFSIZE_MAX) {
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "get interface "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "configuration: "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "maximum buffer "
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt "size exceeded"));
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt isc_mem_put(iter->mctx, iter->buf6, iter->bufsize6);
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews isc_mem_put(iter->mctx, iter->buf6, iter->bufsize6);
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrewsisc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) {
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR)
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * Get the interface configuration, allocating more memory if
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * necessary.
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR)
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * Create an unbound datagram socket to do the SIOCGLIFCONF
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * ioctl on. HP/UX requires an AF_INET6 socket for
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * SIOCGLIFCONF to get IPv6 addresses.
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews if ((iter->socket6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews "making interface "
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews "scan socket: %s"),
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews if ((iter->socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews "making interface "
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews "scan socket: %s"),
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * A newly created iterator has an undefined position
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt * until isc_interfaceiter_first() is called.
febaa091847ab004f40500cc475a819f2c73fcddAndreas Gustafsson isc_mem_put(mctx, iter->buf, iter->bufsize);
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR)
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrewsget_inaddr(isc_netaddr_t *dst, struct in_addr *src) {
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews memcpy(&dst->type.in, src, sizeof(struct in_addr));
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Huntinternal_current_clusteralias(isc_interfaceiter_t *iter) {
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt if (clua_getaliasinfo(&iter->clua_sa, &ci) != CLUA_SUCCESS)
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews memset(&iter->current, 0, sizeof(iter->current));
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews memset(iter->current.name, 0, sizeof(iter->current.name));
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater sprintf(iter->current.name, "clua%d", ci.aliasid);
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews get_inaddr(&iter->current.netmask, &ci.netmask);
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrewslinux_if_inet6_next(isc_interfaceiter_t *iter) {
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews fgets(iter->entry, sizeof(iter->entry), iter->proc) != NULL)
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrewslinux_if_inet6_first(isc_interfaceiter_t *iter) {
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrencelinux_if_inet6_current(isc_interfaceiter_t *iter) {
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson unsigned int i;
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson "/proc/net/if_inet6:iter->proc == NULL");
12e0477d4e132c9122312246ed60aaa646f819b2Mark Andrews res = sscanf(iter->entry, "%32[a-f0-9] %x %x %x %x %16s\n",
12e0477d4e132c9122312246ed60aaa646f819b2Mark Andrews address, &ifindex, &prefix, &flag3, &flag4, name);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson "/proc/net/if_inet6:sscanf() -> %d (expected 6)",
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson "/proc/net/if_inet6:strlen(%s) != 32", address);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson for (i = 0; i < 16; i++) {
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson unsigned char byte;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence static const char hex[] = "0123456789abcdef";
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson byte = ((index(hex, address[i * 2]) - hex) << 4) |
aa23a35d81a9618a40c4a9b44be48009553e4777Andreas Gustafsson isc_netaddr_fromin6(&iter->current.address, &addr6);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson if (isc_netaddr_islinklocal(&iter->current.address)) {
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_netaddr_setzone(&iter->current.address,
69f3cb5abcb38f105c653c7b3df7cec33b87b292Mark Andrews for (i = 0; i < 16; i++) {
69f3cb5abcb38f105c653c7b3df7cec33b87b292Mark Andrews addr6.s6_addr[i] = (0xff << (8 - prefix)) & 0xff;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_netaddr_fromin6(&iter->current.netmask, &addr6);
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt strncpy(iter->current.name, name, sizeof(iter->current.name));
262c39b2366bf79062f7f86b218947523dd1cbacEvan Hunt * Get information about the current interface to iter->current.
262c39b2366bf79062f7f86b218947523dd1cbacEvan Hunt * If successful, return ISC_R_SUCCESS.
262c39b2366bf79062f7f86b218947523dd1cbacEvan Hunt * If the interface has an unsupported address family, or if
262c39b2366bf79062f7f86b218947523dd1cbacEvan Hunt * some operation on it fails, return ISC_R_IGNORE to make
b0bf1ad5b0b1d29b4cdf5de9789405aec5e0844cEvan Hunt * the higher-level iterator code ignore it.
262c39b2366bf79062f7f86b218947523dd1cbacEvan Hunt#if !defined(ISC_PLATFORM_HAVEIF_LADDRREQ) && defined(SIOCGLIFADDR)
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson REQUIRE (iter->pos < (unsigned int) iter->ifc.ifc_len);
c7e266b7e5675e12d1ca3cc929f24b3e86d41f8eEvan Hunt ifrp = (struct ifreq *)((char *) iter->ifc.ifc_req + iter->pos);
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson if (family != AF_INET && family != AF_INET6)
69f3cb5abcb38f105c653c7b3df7cec33b87b292Mark Andrews memset(&iter->current, 0, sizeof(iter->current));
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews INSIST(sizeof(ifreq.ifr_name) <= sizeof(iter->current.name));
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews memset(iter->current.name, 0, sizeof(iter->current.name));
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews memcpy(iter->current.name, ifreq.ifr_name, sizeof(ifreq.ifr_name));
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews (struct sockaddr *)&ifrp->ifr_addr, ifreq.ifr_name);
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * If the interface does not have a address ignore it.
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson if (iter->current.address.type.in.s_addr == htonl(INADDR_ANY))
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson if (memcmp(&iter->current.address.type.in6, &in6addr_any,
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson * Get interface flags.
604419a812b491cd35fb6fad129c3c39da7200a1Mark Andrews * Ignore the HP/UX warning about "interger overflow during
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson * conversion. It comes from its own macro definition,
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson * and is really hard to shut up.
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson if (ioctl(iter->socket, SIOCGIFFLAGS, (char *) &ifreq) < 0) {
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson isc__strerror(errno, strbuf, sizeof(strbuf));
9c566a852f31c3a5d0b9d6eaf11463114339c01dAndreas Gustafsson "%s: getting interface flags: %s",
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson if ((ifreq.ifr_flags & IFF_POINTOPOINT) != 0)
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence iter->current.flags |= INTERFACE_F_POINTTOPOINT;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson if ((ifreq.ifr_flags & IFF_LOOPBACK) != 0)
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson iter->current.flags |= INTERFACE_F_LOOPBACK;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson#if !defined(ISC_PLATFORM_HAVEIF_LADDRREQ) && defined(SIOCGLIFADDR)
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellington memcpy(lifreq.lifr_name, iter->current.name, sizeof(lifreq.lifr_name));
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt memcpy(&lifreq.lifr_addr, &iter->current.address.type.in6,
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson if (ioctl(iter->socket, SIOCGLIFADDR, &lifreq) < 0) {
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc__strerror(errno, strbuf, sizeof(strbuf));
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson "%s: getting interface address: %s",
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence isc_netaddr_format(&iter->current.address, sabuf, sizeof(sabuf));
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson "prefix length for %s is unknown "
bits = 0;
prefixlen = 0;
return (ISC_R_SUCCESS);
inet:
return (ISC_R_IGNORE);
#ifdef IFF_POINTOPOINT
return (ISC_R_IGNORE);
return (ISC_R_IGNORE);
return (ISC_R_SUCCESS);
static isc_result_t
int family;
int fd;
#ifdef ISC_PLATFORM_HAVEIPV6
return (ISC_R_IGNORE);
switch (family) {
case AF_INET:
return (ISC_R_IGNORE);
case AF_INET6:
sizeof(in6addr_any)) == 0)
return (ISC_R_IGNORE);
return (ISC_R_IGNORE);
#ifdef IFF_POINTOPOINT
#ifdef IFF_POINTOPOINT
return (ISC_R_IGNORE);
#ifdef lifr_addrlen
int i, bits;
return (ISC_R_SUCCESS);
return (ISC_R_IGNORE);
return (ISC_R_SUCCESS);
static isc_result_t
#ifdef HAVE_TRUCLUSTER
static isc_result_t
#ifdef __linux
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
#ifdef ISC_PLATFORM_HAVESALEN
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
static isc_result_t
#ifdef ISC_PLATFORM_HAVESALEN
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
static isc_result_t
#ifdef HAVE_TRUCLUSTER
int clua_result;
return (ISC_R_SUCCESS);
#ifdef HAVE_TRUCLUSTER
return (ISC_R_SUCCESS);
#ifdef __linux
#ifdef HAVE_TRUCLUSTER
int clua_result;
#ifdef HAVE_TRUCLUSTER
#ifdef __linux