/* include if_indextoname */
#include "unpifi.h"
#include "unproute.h"
char *
if_indextoname(unsigned int index, char *name)
{
char *buf, *next, *lim;
size_t len;
struct if_msghdr *ifm;
struct sockaddr *sa, *rti_info[RTAX_MAX];
struct sockaddr_dl *sdl;
if ( (buf = net_rt_iflist(0, index, &len)) == NULL)
return(NULL);
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;
if (sdl->sdl_index == index) {
strncpy(name, sdl->sdl_data, sdl->sdl_nlen);
name[sdl->sdl_nlen] = 0; /* null terminate */
free(buf);
return(name);
}
}
}
}
}
free(buf);
return(NULL); /* no match for index */
}
/* end if_indextoname */
char *
If_indextoname(unsigned int index, char *name)
{
char *ptr;
if ( (ptr = if_indextoname(index, name)) == NULL)
err_quit("if_indextoname error for %d", index);
return(ptr);
}
syntax highlighted by Code2HTML, v. 0.9.1