Introduction
Introduction Statistics Contact Development Disclaimer Help
netspeeds.c - slstatus - status monitor
git clone git://git.suckless.org/slstatus
Log
Files
Refs
README
LICENSE
---
netspeeds.c (2890B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <limits.h>
3 #include <stdio.h>
4
5 #include "../slstatus.h"
6 #include "../util.h"
7
8 #if defined(__linux__)
9 #include <stdint.h>
10
11 #define NET_RX_BYTES "/sys/class/net/%s/statistics/rx_bytes"
12 #define NET_TX_BYTES "/sys/class/net/%s/statistics/tx_bytes"
13
14 const char *
15 netspeed_rx(const char *interface)
16 {
17 uintmax_t oldrxbytes;
18 static uintmax_t rxbytes;
19 extern const unsigned int interval;
20 char path[PATH_MAX];
21
22 oldrxbytes = rxbytes;
23
24 if (esnprintf(path, sizeof(path), NET_RX_BYTES, interfac…
25 return NULL;
26 if (pscanf(path, "%ju", &rxbytes) != 1)
27 return NULL;
28 if (oldrxbytes == 0)
29 return NULL;
30
31 return fmt_human((rxbytes - oldrxbytes) * 1000 / interva…
32 1024);
33 }
34
35 const char *
36 netspeed_tx(const char *interface)
37 {
38 uintmax_t oldtxbytes;
39 static uintmax_t txbytes;
40 extern const unsigned int interval;
41 char path[PATH_MAX];
42
43 oldtxbytes = txbytes;
44
45 if (esnprintf(path, sizeof(path), NET_TX_BYTES, interfac…
46 return NULL;
47 if (pscanf(path, "%ju", &txbytes) != 1)
48 return NULL;
49 if (oldtxbytes == 0)
50 return NULL;
51
52 return fmt_human((txbytes - oldtxbytes) * 1000 / interva…
53 1024);
54 }
55 #elif defined(__OpenBSD__) | defined(__FreeBSD__)
56 #include <ifaddrs.h>
57 #include <net/if.h>
58 #include <string.h>
59 #include <sys/types.h>
60 #include <sys/socket.h>
61
62 const char *
63 netspeed_rx(const char *interface)
64 {
65 struct ifaddrs *ifal, *ifa;
66 struct if_data *ifd;
67 uintmax_t oldrxbytes;
68 static uintmax_t rxbytes;
69 extern const unsigned int interval;
70 int if_ok = 0;
71
72 oldrxbytes = rxbytes;
73
74 if (getifaddrs(&ifal) < 0) {
75 warn("getifaddrs failed");
76 return NULL;
77 }
78 rxbytes = 0;
79 for (ifa = ifal; ifa; ifa = ifa->ifa_next)
80 if (!strcmp(ifa->ifa_name, interface) &&
81 (ifd = (struct if_data *)ifa->ifa_data))
82 rxbytes += ifd->ifi_ibytes, if_ok = 1;
83
84 freeifaddrs(ifal);
85 if (!if_ok) {
86 warn("reading 'if_data' failed");
87 return NULL;
88 }
89 if (oldrxbytes == 0)
90 return NULL;
91
92 return fmt_human((rxbytes - oldrxbytes) * 1000 / interva…
93 1024);
94 }
95
96 const char *
97 netspeed_tx(const char *interface)
98 {
99 struct ifaddrs *ifal, *ifa;
100 struct if_data *ifd;
101 uintmax_t oldtxbytes;
102 static uintmax_t txbytes;
103 extern const unsigned int interval;
104 int if_ok = 0;
105
106 oldtxbytes = txbytes;
107
108 if (getifaddrs(&ifal) < 0) {
109 warn("getifaddrs failed");
110 return NULL;
111 }
112 txbytes = 0;
113 for (ifa = ifal; ifa; ifa = ifa->ifa_next)
114 if (!strcmp(ifa->ifa_name, interface) &&
115 (ifd = (struct if_data *)ifa->ifa_data))
116 txbytes += ifd->ifi_obytes, if_ok = 1;
117
118 freeifaddrs(ifal);
119 if (!if_ok) {
120 warn("reading 'if_data' failed");
121 return NULL;
122 }
123 if (oldtxbytes == 0)
124 return NULL;
125
126 return fmt_human((txbytes - oldtxbytes) * 1000 / interva…
127 1024);
128 }
129 #endif
You are viewing proxied material from suckless.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.