1 #include <sys/cdefs.h> 2 #ifndef FSTACK 3 __FBSDID("$FreeBSD$"); 4 5 #include "namespace.h" 6 #endif 7 #include <sys/types.h> 8 #include <sys/socket.h> 9 #include <sys/sockio.h> 10 #include <net/if.h> 11 #include <net/if_dl.h> 12 #include <ifaddrs.h> 13 #include <stdlib.h> 14 #include <string.h> 15 #include <errno.h> 16 #include <unistd.h> 17 #ifndef FSTACK 18 #include "un-namespace.h" 19 #endif 20 21 char * if_indextoname(unsigned int ifindex,char * ifname)22if_indextoname(unsigned int ifindex, char *ifname) 23 { 24 struct ifaddrs *ifaddrs, *ifa; 25 int error = 0; 26 27 if (ifindex == 0) { 28 errno = ENXIO; 29 return(NULL); 30 } 31 32 if (getifaddrs(&ifaddrs) < 0) 33 return(NULL); /* getifaddrs properly set errno */ 34 35 for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { 36 if (ifa->ifa_addr && 37 ifa->ifa_addr->sa_family == AF_LINK && 38 ifindex == LLINDEX((struct sockaddr_dl*)ifa->ifa_addr)) 39 break; 40 } 41 42 if (ifa == NULL) { 43 error = ENXIO; 44 ifname = NULL; 45 } 46 else 47 strncpy(ifname, ifa->ifa_name, IFNAMSIZ); 48 49 freeifaddrs(ifaddrs); 50 51 errno = error; 52 return(ifname); 53 } 54 55