if_nameindex.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /* include if_nameindex */
  2. #include "unpifi.h"
  3. #include "unproute.h"
  4. struct if_nameindex *
  5. if_nameindex(void)
  6. {
  7. char *buf, *next, *lim;
  8. size_t len;
  9. struct if_msghdr *ifm;
  10. struct sockaddr *sa, *rti_info[RTAX_MAX];
  11. struct sockaddr_dl *sdl;
  12. struct if_nameindex *result, *ifptr;
  13. char *namptr;
  14. if ( (buf = net_rt_iflist(0, 0, &len)) == NULL)
  15. return(NULL);
  16. if ( (result = malloc(len)) == NULL) /* overestimate */
  17. return(NULL);
  18. ifptr = result;
  19. namptr = (char *) result + len; /* names start at end of buffer */
  20. lim = buf + len;
  21. for (next = buf; next < lim; next += ifm->ifm_msglen) {
  22. ifm = (struct if_msghdr *) next;
  23. if (ifm->ifm_type == RTM_IFINFO) {
  24. sa = (struct sockaddr *) (ifm + 1);
  25. get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
  26. if ( (sa = rti_info[RTAX_IFP]) != NULL) {
  27. if (sa->sa_family == AF_LINK) {
  28. sdl = (struct sockaddr_dl *) sa;
  29. namptr -= sdl->sdl_nlen + 1;
  30. strncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);
  31. namptr[sdl->sdl_nlen] = 0; /* null terminate */
  32. ifptr->if_name = namptr;
  33. ifptr->if_index = sdl->sdl_index;
  34. ifptr++;
  35. }
  36. }
  37. }
  38. }
  39. ifptr->if_name = NULL; /* mark end of array of structs */
  40. ifptr->if_index = 0;
  41. free(buf);
  42. return(result); /* caller must free() this when done */
  43. }
  44. /* end if_nameindex */
  45. /* include if_freenameindex */
  46. void
  47. if_freenameindex(struct if_nameindex *ptr)
  48. {
  49. free(ptr);
  50. }
  51. /* end if_freenameindex */
  52. struct if_nameindex *
  53. If_nameindex(void)
  54. {
  55. struct if_nameindex *ifptr;
  56. if ( (ifptr = if_nameindex()) == NULL)
  57. err_quit("if_nameindex error");
  58. return(ifptr);
  59. }