tnetspeed.c - spoon - [fork] customized build of spoon, the dwm status utility
HTML git clone git://src.adamsgaard.dk/spoon
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
tnetspeed.c (2379B)
---
1 #include <ctype.h>
2 #include <err.h>
3 #include <inttypes.h>
4 #include <limits.h>
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include "util.h"
10
11 extern int delay;
12
13 static const char *humansztbl[] = { " B", "kB", "MB", "GB", "TB", "PB", "EB",
14 "ZB", "YB" };
15
16 static int
17 humansz(size_t n)
18 {
19 int i;
20 for (i = 0; i < LEN(humansztbl) && n >= 1024; i++)
21 n /= 1024;
22 return i;
23 }
24
25 static void
26 updatenetspeed(char *buf, size_t len, uint64_t rxbytes, uint64_t txbytes)
27 {
28 static uint64_t oldrxbytes, oldtxbytes;
29 uint64_t rx, tx;
30 int irx, itx;
31 rx = (rxbytes - oldrxbytes) / delay;
32 tx = (txbytes - oldtxbytes) / delay;
33 irx = humansz(rx);
34 itx = humansz(tx);
35 snprintf(buf, len, "D:%6.1f%s/s U:%6.1f%s/s", rx
36 / (double)(1 << (10 * irx)), humansztbl[irx], tx
37 / (double)(1 << (10 * itx)), humansztbl[itx]);
38 oldrxbytes = rxbytes;
39 oldtxbytes = txbytes;
40 }
41
42 #ifdef __OpenBSD__
43 #include <sys/socket.h>
44 #include <sys/types.h>
45 #include <net/if.h> /* struct if_data */
46 #include <ifaddrs.h>
47
48 int
49 netspeedread(void *arg, char *buf, size_t len)
50 {
51 char *ifa_name = arg;
52 struct if_data *ifa_data;
53 struct ifaddrs *ifa, *ifap;
54 uint64_t rxbytes, txbytes;
55
56 if (getifaddrs(&ifap) == -1) {
57 warn("getifaddrs");
58 return -1;
59 }
60
61 rxbytes = txbytes = 0;
62
63 for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
64 if (strcmp(ifa_name, ifa->ifa_name) != 0)
65 continue;
66 if (ifa->ifa_data == NULL)
67 continue;
68 ifa_data = ifa->ifa_data;
69 rxbytes += ifa_data->ifi_ibytes;
70 txbytes += ifa_data->ifi_obytes;
71 }
72
73 updatenetspeed(buf, len, rxbytes, txbytes);
74 freeifaddrs(ifap);
75
76 return 0;
77 }
78 #elif __linux__
79 int
80 netspeedread(void *arg, char *buf, size_t len)
81 {
82 char path[PATH_MAX];
83 FILE *fp;
84 char *ifname = arg;
85 unsigned long long rxbytes, txbytes;
86
87 (void)snprintf(path, sizeof(path), "/sys/class/net/%s/statistics/rx_bytes", ifname);
88 if (!(fp = fopen(path, "r"))) {
89 warn("fopen %s", path);
90 return -1;
91 }
92 if (fscanf(fp, "%llu", &rxbytes) != 1) {
93 warn("fscanf %s", path);
94 fclose(fp);
95 return -1;
96 }
97 fclose(fp);
98 (void)snprintf(path, sizeof(path), "/sys/class/net/%s/statistics/tx_bytes", ifname);
99 if (!(fp = fopen(path, "r"))) {
100 warn("fopen %s", path);
101 return -1;
102 }
103 if (fscanf(fp, "%llu", &txbytes) != 1) {
104 warn("fscanf %s", path);
105 fclose(fp);
106 return -1;
107 }
108 fclose(fp);
109
110 updatenetspeed(buf, len, rxbytes, txbytes);
111 return 0;
112 }
113 #endif