- FILE *fp = fopen("/proc/net/if_inet6", "r");
- if (fp) {
- char addrbuf[33], ifbuf[16];
- while (fscanf(fp, "%32s %*x %*x %*x %*x %15s", addrbuf, ifbuf) == 2) {
- if (!strcmp(ifbuf, if_name)) {
- script_unhexlify((uint8_t*)&lladdr, sizeof(lladdr), addrbuf);
+ struct ifaddrs *ifaddr, *ifa;
+
+ if (getifaddrs(&ifaddr) == 0) {
+ for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+ struct sockaddr_in6 *addr;
+
+ if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET6)
+ continue;
+
+ addr = (struct sockaddr_in6*)ifa->ifa_addr;
+
+ if (!IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr))
+ continue;
+
+ if (!strcmp(ifa->ifa_name, if_name)) {
+ lladdr = addr->sin6_addr;
+ has_lladdr = true;