-// vim:ts=8:expandtab
-#include <netinet/in.h>
-#include <sys/socket.h>
+// vim:ts=4:sw=4:expandtab
#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
* 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;
+ int interface_len = strlen(interface);
- 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 &&
+ (strncmp(addrp->ifa_name, interface, interface_len) != 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 (strncmp(addrp->ifa_name, interface, interface_len) != 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, "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;
+}