diff options
author | Tobias Tschinkowitz <he4d@posteo.de> | 2018-05-19 01:29:20 +0200 |
---|---|---|
committer | Aaron Marcher <me@drkhsh.at> | 2018-05-19 01:44:36 +0200 |
commit | 22175f0d5792f1d046b6b501c694a3afabc877ed (patch) | |
tree | c10509c4909000916295352dd28130a95d63dd69 | |
parent | 176d8ff87418a22240a0b079d7dac593d103e984 (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.c | 60 | ||||
-rw-r--r-- | config.def.h | 2 |
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"; |