| 19 | #endif |
| 20 | |
| 21 | char * |
| 22 | if_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 |
no test coverage detected