فهرست منبع

implemented openbsd netspeed functions

implemented the netspeed functionality for openbsd.
furthermore the static keyword was removed of the interval variable in
config.def.h for usage as extern variable.
Tobias Tschinkowitz 7 سال پیش
والد
کامیت
22175f0d57
2فایلهای تغییر یافته به همراه60 افزوده شده و 2 حذف شده
  1. 59 1
      components/netspeeds.c
  2. 1 1
      config.def.h

+ 59 - 1
components/netspeeds.c

@@ -49,5 +49,63 @@
 		return fmt_scaled((txbytes - oldtxbytes) / interval * 1000);
 	}
 #elif defined(__OpenBSD__)
-	/* unimplemented */
+	#include <string.h>
+	#include <ifaddrs.h>
+	#include <sys/types.h>
+	#include <sys/socket.h>
+	#include <net/if.h>
+
+	const char *
+	netspeed_rx(const char *interface)
+	{
+		struct ifaddrs *ifal, *ifa;
+		struct if_data *ifd;
+		static uint64_t oldrxbytes;
+		uint64_t rxbytes = 0;
+		const char *rxs;
+		extern const unsigned int interval;
+
+		if (getifaddrs(&ifal) == -1) {
+			warn("getifaddrs failed");
+			return NULL;
+		}
+		for (ifa = ifal; ifa; ifa = ifa->ifa_next) {
+			if (!strcmp(ifa->ifa_name, interface) &&
+			   (ifd = (struct if_data *)ifa->ifa_data)) {
+				rxbytes += ifd->ifi_ibytes;
+			}
+		}
+		freeifaddrs(ifal);
+
+		rxs = oldrxbytes ? fmt_scaled((rxbytes - oldrxbytes) /
+		                              interval * 1000) : NULL;
+		return (oldrxbytes = rxbytes, rxs);
+	}
+
+	const char *
+	netspeed_tx(const char *interface)
+	{
+		struct ifaddrs *ifal, *ifa;
+		struct if_data *ifd;
+		static uint64_t oldtxbytes;
+		uint64_t txbytes = 0;
+		const char *txs;
+		extern const unsigned int interval;
+
+		if (getifaddrs(&ifal) == -1) {
+			warn("getifaddrs failed");
+			return NULL;
+		}
+		for (ifa = ifal; ifa; ifa = ifa->ifa_next) {
+			if (!strcmp(ifa->ifa_name, interface) &&
+			   (ifd = (struct if_data *)ifa->ifa_data)) {
+				txbytes += ifd->ifi_obytes;
+			}
+		}
+		freeifaddrs(ifal);
+
+		txs = oldtxbytes ? fmt_scaled((txbytes - oldtxbytes) /
+		                              interval * 1000) : NULL;
+		return (oldtxbytes = txbytes, txs);
+	}
 #endif

+ 1 - 1
config.def.h

@@ -1,7 +1,7 @@
 /* See LICENSE file for copyright and license details. */
 
 /* interval between updates (in ms) */
-static const unsigned int interval = 1000;
+const unsigned int interval = 1000;
 
 /* text to show if no value can be retrieved */
 static const char unknown_str[] = "n/a";