Explorar o código

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 %!s(int64=8) %!d(string=hai) anos
pai
achega
22175f0d57
Modificáronse 2 ficheiros con 60 adicións e 2 borrados
  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";