Книга: 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
), то имя интерфейса сравнивается с аргументом.
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- Функция strcmp( )
- Управление функциями узла
- Функция программного обеспечения
- 3.2. Ключи типа key_t и функция ftok
- 9.10. Функция sctp_recvmsg
- Функция document
- Функция generate-id
- Функция console.log
- 9.8. Функция sctp_freeladdrs