dwmclock-netstat.c - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwmclock-netstat.c (3760B)
---
1 #include <X11/Xlib.h>
2 #include <X11/Xatom.h>
3 #include <time.h>
4 #include <locale.h>
5 #include <unistd.h>
6 #include <stdio.h>
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10 #include <string.h>
11 #include <stdint.h>
12 #include <inttypes.h>
13 #include <math.h>
14
15 #define IFNAMSIZ 16
16
17
18 static const char* determine_def_if(void) {
19 FILE *f;
20 const char* ret = 0;
21 static char buf[IFNAMSIZ];
22 char filebuf[256];
23 f = fopen("/proc/net/route", "r");
24 if (f) {
25 while (fgets(filebuf, sizeof filebuf, f)) {
26 char *tab = strchr(filebuf, '\t');
27 if (tab && !strncmp(tab + 1, "00000000", 8)) {
28 memcpy(buf, filebuf, tab - filebuf);
29 buf[tab - filebuf] = 0;
30 ret = buf;
31 break;
32 }
33 }
34 fclose(f);
35 }
36 return ret;
37 }
38
39 static uint64_t readfile(const char* filename) {
40 FILE* f;
41 uint64_t ret = 0, tmp;
42 f = fopen(filename, "r");
43 if (f) {
44 if (fscanf(f, "%"SCNu64, &tmp) == 1)
45 ret = tmp;
46 fclose(f);
47 }
48 return ret;
49 }
50
51 static uint64_t get_rx_bytes(const char* interface)
52 {
53 char fnbuf[sizeof "/sys/class/net//statistics/rx_bytes" + IFNAMSIZ];
54 strcpy(fnbuf, "/sys/class/net/");
55 strcat(fnbuf, interface);
56 strcat(fnbuf, "/statistics/rx_bytes");
57 return readfile(fnbuf);
58 }
59
60 static uint64_t get_tx_bytes(const char* interface)
61 {
62 char fnbuf[sizeof "/sys/class/net//statistics/rx_bytes" + IFNAMSIZ];
63 strcpy(fnbuf, "/sys/class/net/");
64 strcat(fnbuf, interface);
65 strcat(fnbuf, "/statistics/tx_bytes");
66 return readfile(fnbuf);
67 }
68
69 static int get_suff(uint64_t x)
70 {
71 int r = -1 + !x;
72 while (x) {
73 r++;
74 x >>= 10;
75 }
76 return r;
77 }
78
79 int main(void) {
80 Display *dpy;
81 Window root;
82 int loadfd;
83
84 setlocale(LC_ALL, "");
85 dpy = XOpenDisplay(0);
86 if (dpy) {
87 struct timespec tm, s;
88 ssize_t rv;
89 char oldif[IFNAMSIZ] = {0};
90 uint64_t rxb, txb;
91 static const char suffixes[] = " KMGT"; // let's stay real here
92 root = XDefaultRootWindow(dpy);
93 clock_gettime(CLOCK_REALTIME, &tm);
94 s.tv_sec = 0;
95 s.tv_nsec = 1000000000 - tm.tv_nsec;
96 do rv = nanosleep(&s, &s);
97 while (rv == -1 && s.tv_nsec);
98 for (;;) {
99 char buf[100]; // estimate
100 const char *thisif = determine_def_if();
101 uint64_t currxb, curtxb;
102 int idx;
103 int i;
104 if (thisif)
105 {
106 if (strcmp(thisif, oldif))
107 {
108 strcpy(oldif, thisif);
109 rxb = txb = 0;
110 }
111 i = 0;
112 buf[i++] = oldif[0];
113 buf[i++] = ' ';
114 buf[i++] = 'v';
115 currxb = get_rx_bytes(oldif);
116 curtxb = get_tx_bytes(oldif);
117 idx = get_suff(currxb - rxb);
118 i += snprintf(buf + i, sizeof buf - i, "%.1f%c", (double)(currxb - rxb) / pow(1024, idx), suffixes[idx]);
119 rxb = currxb;
120 buf[i++] = ' ';
121 buf[i++] = '^';
122 idx = get_suff(curtxb - txb);
123 i += snprintf(buf + i, sizeof buf - i, "%.1f%c", (double)(curtxb - txb) / pow(1024, idx), suffixes[idx]);
124 txb = curtxb;
125 }
126 else
127 buf[i++] = 'n';
128 buf[i++] = ' ';
129 buf[i++] = '|';
130 buf[i++] = ' ';
131 time_t t;
132 size_t l;
133 t = time(0);
134 l = strftime(buf + i, sizeof buf - i, "%c", localtime(&t));
135 XStoreName(dpy, root, buf);
136 XSync(dpy, False);
137 sleep(1);
138 }
139 }
140 }