/* See LICENSE file for copyright and license details. */ #include #include #include #include #include #include "util.h" const char * ipv4(const char *iface) { struct ifaddrs *ifaddr, *ifa; int s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { warn("Failed to get IPv4 address for interface %s", iface); return NULL; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) { continue; } s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET)) { if (s != 0) { warnx("Failed to get IPv4 address for interface %s", iface); return NULL; } return bprintf("%s", host); } } freeifaddrs(ifaddr); return NULL; } const char * ipv6(const char *iface) { struct ifaddrs *ifaddr, *ifa; int s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { warn("Failed to get IPv6 address for interface %s", iface); return NULL; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) { continue; } s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET6)) { if (s != 0) { warnx("Failed to get IPv6 address for interface %s", iface); return NULL; } return bprintf("%s", host); } } freeifaddrs(ifaddr); return NULL; }