[dev][dwmstatus][patch] Add a simple net usage display function

From: Silvan Jegen <s.jegen_AT_gmail.com>
Date: Thu, 6 Dec 2012 19:21:32 +0100

---
 dwmstatus.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 84 insertions(+), 2 deletions(-)
diff --git a/dwmstatus.c b/dwmstatus.c
index 9b2703b..68dd012 100644
--- a/dwmstatus.c
+++ b/dwmstatus.c
_AT_@ -1,5 +1,6 @@
 #define _BSD_SOURCE
 #include <unistd.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
_AT_@ -48,6 +49,84 @@ settz(char *tzname)
 	setenv("TZ", tzname, 1);
 }
 
+int
+parse_netdev(unsigned long long int *receivedabs, unsigned long long int *sentabs)
+{
+	char *buf;
+	char *eth0start;
+	static int bufsize;
+	FILE *devfd;
+
+	buf = (char *) calloc(255, 1);
+	bufsize = 255;
+	devfd = fopen("/proc/net/dev", "r");
+
+	// ignore the first two lines of the file
+	fgets(buf, bufsize, devfd);
+	fgets(buf, bufsize, devfd);
+
+	while (fgets(buf, bufsize, devfd)) {
+	    if ((eth0start = strstr(buf, "eth0:")) != NULL) {
+
+		// With thanks to the conky project at http://conky.sourceforge.net/
+		sscanf(eth0start + 6, "%llu  %*d     %*d  %*d  %*d  %*d   %*d        %*d       %llu",\
+		       receivedabs, sentabs);
+		free(buf);
+		return 0;
+	    }
+	}
+	free(buf);
+	return 1;
+}
+
+char *
+get_netusage()
+{
+	unsigned long long int oldrec, oldsent, newrec, newsent;
+	double downspeed, upspeed;
+	char *downspeedstr, *upspeedstr;
+	char *retstr;
+	int retval;
+
+	downspeedstr = (char *) malloc(15);
+	upspeedstr = (char *) malloc(15);
+	retstr = (char *) malloc(42);
+
+	retval = parse_netdev(&oldrec, &oldsent);
+	if (retval) {
+	    fprintf(stdout, "Error when parsing /proc/net/dev file.\n");
+	    exit(1);
+	}
+
+	sleep(1);
+	retval = parse_netdev(&newrec, &newsent);
+	if (retval) {
+	    fprintf(stdout, "Error when parsing /proc/net/dev file.\n");
+	    exit(1);
+	}
+
+	downspeed = (newrec - oldrec) / 1024.0;
+	if (downspeed > 1024.0) {
+	    downspeed /= 1024.0;
+	    sprintf(downspeedstr, "%.3f MB/s", downspeed);
+	} else {
+	    sprintf(downspeedstr, "%.2f KB/s", downspeed);
+	}
+
+	upspeed = (newsent - oldsent) / 1024.0;
+	if (upspeed > 1024.0) {
+	    upspeed /= 1024.0;
+	    sprintf(upspeedstr, "%.3f MB/s", upspeed);
+	} else {
+	    sprintf(upspeedstr, "%.2f KB/s", upspeed);
+	}
+	sprintf(retstr, "down: %s up: %s", downspeedstr, upspeedstr);
+
+	free(downspeedstr);
+	free(upspeedstr);
+	return retstr;
+}
+
 char *
 mktimes(char *fmt, char *tzname)
 {
_AT_@ -100,6 +179,7 @@ main(void)
 	char *tmar;
 	char *tmutc;
 	char *tmbln;
+	char *netstats;
 
 	if (!(dpy = XOpenDisplay(NULL))) {
 		fprintf(stderr, "dwmstatus: cannot open display.\n");
_AT_@ -111,11 +191,13 @@ main(void)
 		tmar = mktimes("%H:%M", tzargentina);
 		tmutc = mktimes("%H:%M", tzutc);
 		tmbln = mktimes("KW %W %a %d %b %H:%M %Z %Y", tzberlin);
+		netstats = get_netusage();
 
-		status = smprintf("[L: %s|A: %s|U: %s|%s]",
-				avgs, tmar, tmutc, tmbln);
+		status = smprintf("[L: %s|N: %s|A: %s|U: %s|%s]",
+				avgs, netstats, tmar, tmutc, tmbln);
 		setstatus(status);
 		free(avgs);
+		free(netstats);
 		free(tmar);
 		free(tmutc);
 		free(tmbln);
-- 
1.8.0.1
--7JfCtLOvnd9MIVvH--
Received on Mon Sep 17 2001 - 00:00:00 CEST

This archive was generated by hypermail 2.3.0 : Thu Dec 06 2012 - 20:48:04 CET