diff options
| author | ozpv <39195175+ozpv@users.noreply.github.com> | 2023-05-05 01:30:18 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-05 01:30:18 +0000 |
| commit | 9e533dcb56f3d34a85b5ba7f279c2870ebcc4034 (patch) | |
| tree | 2d8894929472113bd47a151e724d2de38d2be13f /components/netspeeds.c | |
| parent | a8eb66bddbb9b26f977b1fbc37437cc4444aa767 (diff) | |
init
Diffstat (limited to 'components/netspeeds.c')
| -rw-r--r-- | components/netspeeds.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/components/netspeeds.c b/components/netspeeds.c new file mode 100644 index 0000000..b61b4c9 --- /dev/null +++ b/components/netspeeds.c @@ -0,0 +1,74 @@ +/* See LICENSE file for copyright and license details. */ +#include <limits.h> +#include <stdio.h> + +#include "../slstatus.h" +#include "../util.h" + +#if defined(__linux__) + #include <stdint.h> + + #define NET_RX_BYTES "/sys/class/net/%s/statistics/rx_bytes" + + const char * + netspeed_rx(const char *interface) + { + uintmax_t oldrxbytes; + static uintmax_t rxbytes; + extern const unsigned int interval; + char path[PATH_MAX]; + + oldrxbytes = rxbytes; + + if (esnprintf(path, sizeof(path), NET_RX_BYTES, interface) < 0) + return NULL; + if (pscanf(path, "%ju", &rxbytes) != 1) + return NULL; + if (oldrxbytes == 0) + return NULL; + + return fmt_human((rxbytes - oldrxbytes) * 1000 / interval, + 1024); + } + +#elif defined(__OpenBSD__) | defined(__FreeBSD__) + #include <ifaddrs.h> + #include <net/if.h> + #include <string.h> + #include <sys/types.h> + #include <sys/socket.h> + + const char * + netspeed_tx(const char *interface) + { + struct ifaddrs *ifal, *ifa; + struct if_data *ifd; + uintmax_t oldtxbytes; + static uintmax_t txbytes; + extern const unsigned int interval; + int if_ok = 0; + + oldtxbytes = txbytes; + + if (getifaddrs(&ifal) < 0) { + warn("getifaddrs failed"); + return NULL; + } + txbytes = 0; + 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, if_ok = 1; + + freeifaddrs(ifal); + if (!if_ok) { + warn("reading 'if_data' failed"); + return NULL; + } + if (oldtxbytes == 0) + return NULL; + + return fmt_human((txbytes - oldtxbytes) * 1000 / interval, + 1024); + } +#endif |
