Introduction
Introduction Statistics Contact Development Disclaimer Help
netspeed.c - spoon - set dwm status
git clone git://git.codemadness.org/spoon
Log
Files
Refs
LICENSE
---
netspeed.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", …
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…
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…
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
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.