Книга: UNIX: разработка сетевых приложений

Функция if_nametoindex

Функция if_nametoindex

В листинге 18.11 показана функция if_nametoindex.

Листинг 18.11. Возвращение индекса интерфейса по его имени

//libroute/if_nametoindex.c
 1 #include "unpifi.h"
 2 #include "unproute.h"
 3 unsigned int
 4 if_nametoindex(const char *name)
 5 {
 6  unsigned int idx, namelen;
 7  char *buf, *next, *lim;
 8  size_t len;
 9  struct if_msghdr *ifm;
10  struct sockadd *sa, *rti_info[RTAX_MAX];
11  struct sockaddr_dl *sdl;
12  if ((buf = net_rt_iflist(0, 0, &len)) == NULL)
13   return(0);
14  namelen = strlen(name);
15  lim = buf + len;
16  for (next = buf; next < lim; next += ifm->ifm_msglen) {
17   ifm = (struct if_msghdr*)next;
18   if (ifm->ifm_type == RTM_IFINFO) {
19    sa = (struct sockaddr*)(ifm + 1);
20    get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
21    if ((sa = rti_infо[RTAX_IFP]) != NULL) {
22     if (sa->sa_family == AF_LINK) {
23      sdl = (struct sockaddr_dl*)sa;
24      if (sdl->sdl_nlen == namelen
25       && strncmp(&sdl->sdl_data[0], name,
26       sdl->sdl_nlen) == 0) {
27       idx = sdl->sdl_index; /* сохранение перед
                                  вызовом free */
28       free(buf);
29       return(idx);
30      }
31     }
32    }
33   }
34  }
35  free(buf);
36  return(0); /* индекс для имени не найден */
37 }

Получение списка интерфейсов

12-13 Наша функция net_rt_iflist возвращает список интерфейсов.

Обработка только сообщений RTM_IFINFO

17-30 Мы обрабатываем сообщения в буфере (см. рис. 18.4) в поисках сообщений типа RTM_IFINFO. Найдя такое сообщение, мы вызываем нашу функцию get_rtaddrs, чтобы установить указатели на структуры адреса сокета, а если присутствует структура имени интерфейса (элемент RTAX_IFP массива rti_info), то имя интерфейса сравнивается с аргументом.

Оглавление книги


Генерация: 5.688. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз