bind9/lib/isc/include/isc/interfaceiter.h
Ondřej Surý f3635bcc14 Use #pragma once as header guards
Unify the header guard style and replace the inconsistent include guards
with #pragma once.

The #pragma once is widely and very well supported in all compilers that
BIND 9 supports, and #pragma once was already in use in several new or
refactored headers.

Using simpler method will also allow us to automate header guard checks
as this is simpler to programatically check.

For reference, here are the reasons for the change taken from
Wikipedia[1]:

> In the C and C++ programming languages, #pragma once is a non-standard
> but widely supported preprocessor directive designed to cause the
> current source file to be included only once in a single compilation.
>
> Thus, #pragma once serves the same purpose as include guards, but with
> several advantages, including: less code, avoidance of name clashes,
> and sometimes improvement in compilation speed. On the other hand,
> #pragma once is not necessarily available in all compilers and its
> implementation is tricky and might not always be reliable.

1. https://en.wikipedia.org/wiki/Pragma_once
2021-10-13 00:49:15 -07:00

125 lines
3 KiB
C

/*
* Copyright (C) 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 https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#pragma once
/*****
***** Module Info
*****/
/*! \file isc/interfaceiter.h
* \brief Iterates over the list of network interfaces.
*
* Interfaces whose address family is not supported are ignored and never
* returned by the iterator. Interfaces whose netmask, interface flags,
* or similar cannot be obtained are also ignored, and the failure is logged.
*
* Standards:
* The API for scanning varies greatly among operating systems.
* This module attempts to hide the differences.
*/
/***
*** Imports
***/
#include <inttypes.h>
#include <isc/lang.h>
#include <isc/netaddr.h>
#include <isc/types.h>
/*!
* \brief Public structure describing a network interface.
*/
struct isc_interface {
char name[32]; /*%< Interface name, null-terminated. */
unsigned int af; /*%< Address family. */
isc_netaddr_t address; /*%< Local address. */
isc_netaddr_t netmask; /*%< Network mask. */
isc_netaddr_t dstaddress; /*%< Destination address
* (point-to-point
* only). */
uint32_t flags; /*%< Flags; see INTERFACE flags. */
};
/*@{*/
/*! Interface flags. */
#define INTERFACE_F_UP 0x00000001U
#define INTERFACE_F_POINTTOPOINT 0x00000002U
#define INTERFACE_F_LOOPBACK 0x00000004U
/*@}*/
/***
*** Functions
***/
ISC_LANG_BEGINDECLS
isc_result_t
isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp);
/*!<
* \brief Create an iterator for traversing the operating system's list
* of network interfaces.
*
* Returns:
*\li #ISC_R_SUCCESS
* \li #ISC_R_NOMEMORY
*\li Various network-related errors
*/
isc_result_t
isc_interfaceiter_first(isc_interfaceiter_t *iter);
/*!<
* \brief Position the iterator on the first interface.
*
* Returns:
*\li #ISC_R_SUCCESS Success.
*\li #ISC_R_NOMORE There are no interfaces.
*/
isc_result_t
isc_interfaceiter_current(isc_interfaceiter_t *iter, isc_interface_t *ifdata);
/*!<
* \brief Get information about the interface the iterator is currently
* positioned at and store it at *ifdata.
*
* Requires:
*\li The iterator has been successfully positioned using
* isc_interface_iter_first() / isc_interface_iter_next().
*
* Returns:
*\li #ISC_R_SUCCESS Success.
*/
isc_result_t
isc_interfaceiter_next(isc_interfaceiter_t *iter);
/*!<
* \brief Position the iterator on the next interface.
*
* Requires:
* \li The iterator has been successfully positioned using
* isc_interface_iter_first() / isc_interface_iter_next().
*
* Returns:
*\li #ISC_R_SUCCESS Success.
*\li #ISC_R_NOMORE There are no more interfaces.
*/
void
isc_interfaceiter_destroy(isc_interfaceiter_t **iterp);
/*!<
* \brief Destroy the iterator.
*/
ISC_LANG_ENDDECLS