Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

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
— это заданный индекс, поэтому результат должен содержать информацию только для определенного интерфейса. Когда обнаруживается совпадение, возвращается имя интерфейса, к которому добавляется завершающий нуль.

Функция if_nameindex

Следующая функция,

if_nameindex
, возвращает массив структур
if_nameindex
, содержащих все имена интерфейсов и индексы. Она показана в листинге 18.13.

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

/

/libroute/if_nameindex.c

1 #include "unpifi.h"

2 #include "unproute.h"

3 struct if_nameindex*

4 if_nameindex(void)

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 struct if_nameindex *result, *ifptr;

12 char *namptr;

13 if ((buf = net_it_iflist(0, 0, &len)) == NULL)

14 return (NULL);

15 if ((result = malloc(len)) == NULL) /* завышенная оценка */

16 return (NULL);

17 ifptr = result;

18 namptr = (char*)result + len; /* имена начинаются с конца буфера */

19 lim = buf + len;

20 for (next = buf; next < lim; next += ifm->ifm_msglen) {

21 ifm = (struct if_msghdr*)next;

22 if (ifm->ifm_type == RTM_IFINFO) {

23 sa = (struct sockaddr*)(ifm + 1);

24 get_rtaddrs(ifm->ifm_addrs, sa, rti_info);

25 if ((sa = rti_infо[RTAX_IFP]) != NULL) {

26 if (sa->sa_family == AF_LINK) {

27 sdl = (struct sockaddr_in*)sa;

28 namptr -= sdl->sdl_nlen + 1;

29 strncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);

30 namptr[sdl->sdl_nlen] = 0; /* завершающий нуль */

31 ifptr->if_name = namptr;

32 ifptr->if_index = sdl->sdl_index;

33 ifptr++;

  • Читать дальше
  • 1
  • ...
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: