diff options
-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"; |