X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fprint_ip_addr.c;h=f9cd1f48bd1535949abb66f8d45658217543f39c;hb=279e2fccf4c3bf48edd6a0ac68778ec235831599;hp=909a8b261b697c4b1166dc937a2c0628963117d8;hpb=296eb5e7063b4051927f2e2bf94e1034bf64f60c;p=i3%2Fi3status diff --git a/src/print_ip_addr.c b/src/print_ip_addr.c index 909a8b2..f9cd1f4 100644 --- a/src/print_ip_addr.c +++ b/src/print_ip_addr.c @@ -1,4 +1,4 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab #include #include #include @@ -17,51 +17,55 @@ * interface is up and running but hasn't got an IP address yet * */ -const char *get_ip_addr(const char *interface) { - static char part[512]; - socklen_t len = sizeof(struct sockaddr_in); - memset(part, 0, sizeof(part)); +const char *get_ip_addr(const char *interface, int family) { + static char part[512]; + socklen_t len = 0; + if (family == AF_INET) + len = sizeof(struct sockaddr_in); + else if (family == AF_INET6) + len = sizeof(struct sockaddr_in6); - struct ifaddrs *ifaddr, *addrp; - bool found = false; + memset(part, 0, sizeof(part)); - getifaddrs(&ifaddr); + struct ifaddrs *ifaddr, *addrp; + bool found = false; - if (ifaddr == NULL) - return NULL; + getifaddrs(&ifaddr); - /* Skip until we are at the AF_INET address of interface */ - for (addrp = ifaddr; + if (ifaddr == NULL) + return NULL; - (addrp != NULL && - (strcmp(addrp->ifa_name, interface) != 0 || - addrp->ifa_addr == NULL || - addrp->ifa_addr->sa_family != AF_INET)); + /* Skip until we are at the input family address of interface */ + for (addrp = ifaddr; - addrp = addrp->ifa_next) { - /* Check if the interface is down */ - if (strcmp(addrp->ifa_name, interface) != 0) - continue; - found = true; - if ((addrp->ifa_flags & IFF_RUNNING) == 0) { - freeifaddrs(ifaddr); - return NULL; - } - } + (addrp != NULL && + (strcmp(addrp->ifa_name, interface) != 0 || + addrp->ifa_addr == NULL || + addrp->ifa_addr->sa_family != family)); - if (addrp == NULL) { - freeifaddrs(ifaddr); - return (found ? "no IP" : NULL); + addrp = addrp->ifa_next) { + /* Check if the interface is down */ + if (strcmp(addrp->ifa_name, interface) != 0) + continue; + found = true; + if ((addrp->ifa_flags & IFF_RUNNING) == 0) { + freeifaddrs(ifaddr); + return NULL; } + } - int ret; - if ((ret = getnameinfo(addrp->ifa_addr, len, part, sizeof(part), NULL, 0, NI_NUMERICHOST)) != 0) { - fprintf(stderr, "i3status: getnameinfo(): %s\n", gai_strerror(ret)); - freeifaddrs(ifaddr); - return "no IP"; - } + if (addrp == NULL) { + freeifaddrs(ifaddr); + return (found ? "no IP" : NULL); + } + int ret; + if ((ret = getnameinfo(addrp->ifa_addr, len, part, sizeof(part), NULL, 0, NI_NUMERICHOST)) != 0) { + fprintf(stderr, "i3status: getnameinfo(): %s\n", gai_strerror(ret)); freeifaddrs(ifaddr); - return part; -} + return "no IP"; + } + freeifaddrs(ifaddr); + return part; +}