summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Tschinkowitz <he4d@posteo.de>2018-05-19 01:29:20 +0200
committerAaron Marcher <me@drkhsh.at>2018-05-19 01:44:36 +0200
commit63310c847424f11a41d001dce0b9e4d785923098 (patch)
treec10509c4909000916295352dd28130a95d63dd69
parent1422d5ccfd7215a40a2bb45e79e36069a840e97d (diff)
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.
-rw-r--r--components/netspeeds.c60
-rw-r--r--config.def.h2
2 files changed, 60 insertions, 2 deletions
diff --git a/components/netspeeds.c b/components/netspeeds.c
index ef8bf93..9315fef 100644
--- a/components/netspeeds.c
+++ b/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
diff --git a/config.def.h b/config.def.h
index bf6aef9..49ea282 100644
--- a/config.def.h
+++ b/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";