瀏覽代碼

Added IPv6 address function

- Renamed "ip" function to "ipv4"
- Added "ipv6" function
- Adjusted README and config.def.h accordingly
Aaron Marcher 8 年之前
父節點
當前提交
8f5219b6da
共有 3 個文件被更改,包括 39 次插入6 次删除
  1. 1 1
      README
  2. 2 1
      config.def.h
  3. 36 4
      slstatus.c

+ 1 - 1
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

+ 2 - 1
config.def.h

@@ -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

+ 36 - 4
slstatus.c

@@ -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);