if_freenameindex - получает имена сетевых интерфейсов и
if_freenameindex(3)
получает имена сетевых интерфейсов и
Other Alias
if_nameindex
ОБЗОР
#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);
}