if_nameindex(3) получает имена сетевых интерфейсов и

Other Alias

if_freenameindex

ОБЗОР

#include <net/if.h>


struct if_nameindex *if_nameindex(void);
void if_freenameindex(struct if_nameindex *ptr);

ОПИСАНИЕ

Функция if_nameindex() возвращает массив структур if_nameindex, каждая из которых содержит информацию об одном из сетевых интерфейсов системы. Структура if_nameindex содержит по крайней мере следующие данные:

    unsigned int if_index; /* индекс интерфейса (1, 2, …) */
    char        *if_name;  /* имя с Null в конце («eth0», и т. д.) */

В поле if_index содержится индекс интерфейса. Значение поля ifa_name указывает на имя интерфейса (завершается null). Конец массива определяется по записи if_index с нулевым значением и по записи ifa_name со значением NULL.

Память под структуру данных, возвращаемая if_nameindex(), выделяется динамически и должна освобождаться с помощью if_freenameindex(), когда больше не нужна.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении if_nameindex() возвращает указатель на массив. В случае ошибки возвращается NULL, а errno устанавливается в соответствующее значение.

ОШИБКИ

Функция if_nameindex() может завершиться с ошибкой и изменить errno если:
ENOBUFS
Недостаточно ресурсов.

Также функция if_nameindex() может завершиться с ошибками, перечисленными в socket(2), bind(2), ioctl(2), getsockname(2), recvmsg(2), sendto(2) или malloc(3).

ВЕРСИИ

Впервые функция if_nameindex() появилась в glibc 2.1, но до glibc 2.3.4, реализация поддерживала только интерфейсы с адресами IPv4. Поддержка интерфейсов без адресов IPv4 доступна только в ядрах, поддерживающих netlink.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
if_nameindex(),
if_freenameindex()
безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, RFC 3493.

Эта функция впервые появилась в BSDi.

ПРИМЕР

В программе, показанной далее, демонстрируется использование функции, описанной на этой странице. Пример вывода этой программы может быть следующим:

$ ./a.out
1: lo
2: wlan0
3: em1

Исходный код программы

#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
    struct if_nameindex *if_ni, *i;
    if_ni = if_nameindex();
    if (if_ni == NULL) {
        perror("if_nameindex");
        exit(EXIT_FAILURE);
    }
    for (i = if_ni; ! (i->if_index == 0 && i->if_name == NULL); i++)
        printf("%u: %s\n", i->if_index, i->if_name);
    if_freenameindex(if_ni);
    exit(EXIT_SUCCESS);
}