| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- /* include if_nameindex */
- #include "unpifi.h"
- #include "unproute.h"
- struct if_nameindex *
- if_nameindex(void)
- {
- char *buf, *next, *lim;
- size_t len;
- struct if_msghdr *ifm;
- struct sockaddr *sa, *rti_info[RTAX_MAX];
- struct sockaddr_dl *sdl;
- struct if_nameindex *result, *ifptr;
- char *namptr;
- if ( (buf = net_rt_iflist(0, 0, &len)) == NULL)
- return(NULL);
- if ( (result = malloc(len)) == NULL) /* overestimate */
- return(NULL);
- ifptr = result;
- namptr = (char *) result + len; /* names start at end of buffer */
- lim = buf + len;
- for (next = buf; next < lim; next += ifm->ifm_msglen) {
- ifm = (struct if_msghdr *) next;
- if (ifm->ifm_type == RTM_IFINFO) {
- sa = (struct sockaddr *) (ifm + 1);
- get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
- if ( (sa = rti_info[RTAX_IFP]) != NULL) {
- if (sa->sa_family == AF_LINK) {
- sdl = (struct sockaddr_dl *) sa;
- namptr -= sdl->sdl_nlen + 1;
- strncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);
- namptr[sdl->sdl_nlen] = 0; /* null terminate */
- ifptr->if_name = namptr;
- ifptr->if_index = sdl->sdl_index;
- ifptr++;
- }
- }
- }
- }
- ifptr->if_name = NULL; /* mark end of array of structs */
- ifptr->if_index = 0;
- free(buf);
- return(result); /* caller must free() this when done */
- }
- /* end if_nameindex */
- /* include if_freenameindex */
- void
- if_freenameindex(struct if_nameindex *ptr)
- {
- free(ptr);
- }
- /* end if_freenameindex */
- struct if_nameindex *
- If_nameindex(void)
- {
- struct if_nameindex *ifptr;
- if ( (ifptr = if_nameindex()) == NULL)
- err_quit("if_nameindex error");
- return(ifptr);
- }
|