/* * Copy me if you can. * by 20h */ #define _BSD_SOURCE #include #include #include #include #include #include #include #include #include #include #include char *tzberlin = "Europe/Berlin"; static Display *dpy; char * smprintf(char *fmt, ...) { va_list fmtargs; char *ret; int len; va_start(fmtargs, fmt); len = vsnprintf(NULL, 0, fmt, fmtargs); va_end(fmtargs); ret = malloc(++len); if (ret == NULL) { perror("malloc"); exit(1); } va_start(fmtargs, fmt); vsnprintf(ret, len, fmt, fmtargs); va_end(fmtargs); return ret; } void settz(char *tzname) { setenv("TZ", tzname, 1); } char * mktimes(char *fmt, char *tzname) { char buf[129]; time_t tim; struct tm *timtm; settz(tzname); tim = time(NULL); timtm = localtime(&tim); if (timtm == NULL) return smprintf(""); if (!strftime(buf, sizeof(buf)-1, fmt, timtm)) { fprintf(stderr, "strftime == 0\n"); return smprintf(""); } return smprintf("%s", buf); } void setstatus(char *str) { XStoreName(dpy, DefaultRootWindow(dpy), str); XSync(dpy, False); } char * loadavg(void) { double avgs[3]; if (getloadavg(avgs, 3) < 0) return smprintf(""); return smprintf("%.2f", avgs[1]); } char * execscript(char *cmd) { FILE *fp; char retval[1025], *rv; memset(retval, 0, sizeof(retval)); fp = popen(cmd, "r"); if (fp == NULL) return smprintf(""); rv = fgets(retval, sizeof(retval), fp); pclose(fp); if (rv == NULL) return smprintf(""); retval[strlen(retval)-1] = '\0'; return smprintf("%s", retval); } int main(void) { char *status; char *avg; char *tmbln; char *ips; char *track; char *temp; char *partition; if (!(dpy = XOpenDisplay(NULL))) { fprintf(stderr, "dwmstatus: cannot open display.\n"); return 1; } for (;;sleep(1)) { avg = loadavg(); tmbln = mktimes("%a %d %b %H:%M", tzberlin); ips = execscript("ip a | grep 'inet ' | grep -v 127.0.0.1 | tr -s ' ' |cut -f3 -d' '"); temp = execscript("sensors amdgpu-pci-0400 | grep edge | cut -c 16-22"); track = execscript("mpc -h core-a.lan | head -n 1 | grep -v volume || echo"); partition = execscript("df -lh | grep cryptroot | tr -s ' ' | cut -d ' ' -f 4"); status = smprintf(" %s | %s | %s | %s | %s", track, avg, temp, partition, tmbln); setstatus(status); free(avg); free(tmbln); free(ips); free(track); free(temp); free(partition); free(status); } XCloseDisplay(dpy); return 0; }