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

Функция if_indextoname

Функция if_indextoname

Следующая функция, if_indextoname, показана в листинге 18.12.

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

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

Эта функция практически идентична предыдущей, но вместо поиска имени интерфейса мы сравниваем индекс интерфейса с аргументом вызывающего процесса. Кроме того, второй аргумент нашей функции net_rt_iflist — это заданный индекс, поэтому результат должен содержать информацию только для определенного интерфейса. Когда обнаруживается совпадение, возвращается имя интерфейса, к которому добавляется завершающий нуль.

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


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