Функция if_nametoindex

We use cookies. Read the Privacy and Cookie Policy

Функция 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), то имя интерфейса сравнивается с аргументом.

Данный текст является ознакомительным фрагментом.