Added IPv6 address function
authorAaron Marcher <me@drkhsh.at>
Mon, 14 Aug 2017 16:00:46 +0000 (18:00 +0200)
committerAaron Marcher <me@drkhsh.at>
Mon, 14 Aug 2017 16:00:46 +0000 (18:00 +0200)
- Renamed "ip" function to "ipv4"
- Added "ipv6" function
- Adjusted README and config.def.h accordingly

README
config.def.h
slstatus.c

diff --git a/README b/README
index 0dde3368486983fd1c4ff81621e6e994c1d33b88..19f422efa1af526f03be2381e618fa738607dd52 100644 (file)
--- a/README
+++ b/README
@@ -15,7 +15,7 @@ Features
 - Available entropy
 - Username/GID/UID
 - Hostname
-- IP address
+- IP address (IPv4 and IPv6)
 - Kernel version
 - Keyboard indicators
 - Load average
index a55dafa47d3f8722330c7405230a5c8b01268a12..f4a6bed8804d126047508bb91b9606f48dab5536 100644 (file)
@@ -25,7 +25,8 @@ static const char unknown_str[] = "n/a";
  * entropy              available entropy               NULL
  * gid                  GID of current user             NULL
  * hostname             hostname                        NULL
- * ip                   IPv4 address                    interface name
+ * ipv4                 IPv4 address                    interface name
+ * ipv6                 IPv6 address                    interface name
  * kernel_release       `uname -r`                      NULL
  * keyboard_indicators  caps/num lock indicators        NULL
  * load_avg             load average                    NULL
index f72f99445f7c2e52d42a1ef5fd18cced6c9ac593..d0d176732b49a09eddf9fe2f9bdb831c76df9ef4 100644 (file)
@@ -48,7 +48,8 @@ static const char *disk_used(const char *mnt);
 static const char *entropy(void);
 static const char *gid(void);
 static const char *hostname(void);
-static const char *ip(const char *iface);
+static const char *ipv4(const char *iface);
+static const char *ipv6(const char *iface);
 static const char *kernel_release(void);
 static const char *keyboard_indicators(void);
 static const char *load_avg(void);
@@ -294,14 +295,14 @@ hostname(void)
 }
 
 static const char *
-ip(const char *iface)
+ipv4(const char *iface)
 {
        struct ifaddrs *ifaddr, *ifa;
        int s;
        char host[NI_MAXHOST];
 
        if (getifaddrs(&ifaddr) == -1) {
-               warn("Failed to get IP address for interface %s", iface);
+               warn("Failed to get IPv4 address for interface %s", iface);
                return unknown_str;
        }
 
@@ -312,7 +313,38 @@ ip(const char *iface)
                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 IP address for interface %s", iface);
+                               warnx("Failed to get IPv4 address for interface %s", iface);
+                               return unknown_str;
+                       }
+                       return bprintf("%s", host);
+               }
+       }
+
+       freeifaddrs(ifaddr);
+
+       return unknown_str;
+}
+
+static 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 unknown_str;
+       }
+
+       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 unknown_str;
                        }
                        return bprintf("%s", host);