Copyright 2016 Daniel Walter <d.walter@0x90.at>
Copyright 2016-2018 Ali H. Fardan <raiz@firemail.cc>
Copyright 2016 Jody Leonard <me@jodyleonard.com>
-Copyright 2016-2018 Quentin Rameau <quinq@fifth.space>
+Copyright 2016-2017 Quentin Rameau <quinq@fifth.space>
Copyright 2016 Mike Coddington <mike@coddington.us>
Copyright 2016-2018 parazyd <parazyd@dyne.org>
Copyright 2017 Tobias Stoeckmann <tobias@stoeckmann.org>
# slstatus - suckless status monitor
.POSIX:
-include os.mk
include config.mk
REQ = util
COM =\
- components/$(OS)/battery \
- components/$(OS)/cpu \
+ components/battery\
+ components/cpu\
components/datetime\
components/disk\
- components/$(OS)/entropy \
+ components/entropy\
components/hostname\
components/ip\
components/kernel_release\
components/keyboard_indicators\
components/load_avg\
components/num_files\
- components/$(OS)/ram \
+ components/ram\
components/run_command\
- components/$(OS)/swap \
- components/$(OS)/temperature \
- components/$(OS)/uptime \
+ components/swap\
+ components/temperature\
+ components/uptime\
components/user\
components/volume\
- components/$(OS)/wifi
-
-SLSCFLAGS = -I$(X11INC) -D_DEFAULT_SOURCE $(CFLAGS)
-SLSLDFLAGS = -L$(X11LIB) $(LDFLAGS)
-SLSLIBS = -lX11 $(OSLIBS) $(LIBS)
+ components/wifi
all: slstatus
cp config.def.h $@
.o:
- $(CC) -o $@ $(SLSLDFLAGS) $< $(COM:=.o) $(REQ:=.o) $(SLSLIBS)
+ $(CC) -o $@ $(LDFLAGS) $< $(COM:=.o) $(REQ:=.o) $(LDLIBS)
.c.o:
- $(CC) -o $@ -c $(SLSCFLAGS) $<
+ $(CC) -o $@ -c $(CPPFLAGS) $(CFLAGS) $<
clean:
rm -f slstatus slstatus.o $(COM:=.o) $(REQ:=.o)
-distclean:
- for os in Linux OpenBSD; do make OS="$$os" clean; done
- rm -f os.mk
-
dist:
rm -rf "slstatus-$(VERSION)"
mkdir -p "slstatus-$(VERSION)/components"
Installation
------------
-Run ./configure first to detect your operating system.
-Optionally edit config.mk to match your local setup (slstatus is installed into
-the /usr/local namespace by default). Uncomment OSSLIBS on OpenBSD.
+Edit config.mk to match your local setup (slstatus is installed into the
+/usr/local namespace by default). Uncomment OSSLIBS on OpenBSD.
Afterwards enter the following command to build and install slstatus (if
necessary as root):
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <limits.h>
-#include <string.h>
-
-#include "../../util.h"
-
-const char *
-battery_perc(const char *bat)
-{
- int perc;
- char path[PATH_MAX];
-
- snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/capacity");
- return (pscanf(path, "%i", &perc) == 1) ?
- bprintf("%d", perc) : NULL;
-}
-
-const char *
-battery_power(const char *bat)
-{
- int watts;
- char path[PATH_MAX];
-
- snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/power_now");
- return (pscanf(path, "%i", &watts) == 1) ?
- bprintf("%d", (watts + 500000) / 1000000) : NULL;
-}
-
-const char *
-battery_state(const char *bat)
-{
- struct {
- char *state;
- char *symbol;
- } map[] = {
- { "Charging", "+" },
- { "Discharging", "-" },
- { "Full", "=" },
- { "Unknown", "/" },
- };
- size_t i;
- char path[PATH_MAX], state[12];
-
- snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/status");
- if (pscanf(path, "%12s", state) != 1) {
- return NULL;
- }
-
- for (i = 0; i < LEN(map); i++) {
- if (!strcmp(map[i].state, state)) {
- break;
- }
- }
- return (i == LEN(map)) ? "?" : map[i].symbol;
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../../util.h"
-
-const char *
-cpu_freq(void)
-{
- int freq;
-
- return (pscanf("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq",
- "%i", &freq) == 1) ?
- bprintf("%d", (freq + 500) / 1000) : NULL;
-}
-
-const char *
-cpu_perc(void)
-{
- int perc;
- static long double a[7];
- static int valid;
- long double b[7];
-
- memcpy(b, a, sizeof(b));
- if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
- &a[3], &a[4], &a[5], &a[6]) != 7) {
- return NULL;
- }
- if (!valid) {
- valid = 1;
- return NULL;
- }
-
- perc = 100 * ((b[0]+b[1]+b[2]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[5]+a[6])) /
- ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
-
- return bprintf("%d", perc);
-}
-
-const char *
-cpu_iowait(void)
-{
- int perc;
- static int valid;
- static long double a[7];
- long double b[7];
-
- memcpy(b, a, sizeof(b));
- if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
- &a[3], &a[4], &a[5], &a[6]) != 7) {
- return NULL;
- }
- if (!valid) {
- valid = 1;
- return NULL;
- }
-
- perc = 100 * ((b[4]) - (a[4])) /
- ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
-
- return bprintf("%d", perc);
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <stdio.h>
-
-#include "../../util.h"
-
-const char *
-entropy(void)
-{
- int num;
-
- return (pscanf("/proc/sys/kernel/random/entropy_avail", "%d", &num) == 1) ?
- bprintf("%d", num) : NULL;
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <stdio.h>
-
-#include "../../util.h"
-
-const char *
-ram_free(void)
-{
- long free;
-
- return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ?
- bprintf("%f", (float)free / 1024 / 1024) : NULL;
-}
-
-const char *
-ram_perc(void)
-{
- long total, free, buffers, cached;
-
- return (pscanf("/proc/meminfo",
- "MemTotal: %ld kB\n"
- "MemFree: %ld kB\n"
- "MemAvailable: %ld kB\nBuffers: %ld kB\n"
- "Cached: %ld kB\n",
- &total, &free, &buffers, &buffers, &cached) == 5) ?
- bprintf("%d", 100 * ((total - free) - (buffers + cached)) / total) :
- NULL;
-}
-
-const char *
-ram_total(void)
-{
- long total;
-
- return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ?
- bprintf("%f", (float)total / 1024 / 1024) : NULL;
-}
-
-const char *
-ram_used(void)
-{
- long total, free, buffers, cached;
-
- return (pscanf("/proc/meminfo",
- "MemTotal: %ld kB\n"
- "MemFree: %ld kB\n"
- "MemAvailable: %ld kB\nBuffers: %ld kB\n"
- "Cached: %ld kB\n",
- &total, &free, &buffers, &buffers, &cached) == 5) ?
- bprintf("%f", (float)(total - free - buffers - cached) / 1024 / 1024) :
- NULL;
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../../util.h"
-
-const char *
-swap_free(void)
-{
- long total, free;
- FILE *fp;
- size_t bytes_read;
- char *match;
-
- fp = fopen("/proc/meminfo", "r");
- if (fp == NULL) {
- fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
- return NULL;
- }
-
- if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
- fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
- fclose(fp);
- return NULL;
- }
- fclose(fp);
-
- if ((match = strstr(buf, "SwapTotal")) == NULL)
- return NULL;
- sscanf(match, "SwapTotal: %ld kB\n", &total);
-
- if ((match = strstr(buf, "SwapFree")) == NULL)
- return NULL;
- sscanf(match, "SwapFree: %ld kB\n", &free);
-
- return bprintf("%f", (float)free / 1024 / 1024);
-}
-
-const char *
-swap_perc(void)
-{
- long total, free, cached;
- FILE *fp;
- size_t bytes_read;
- char *match;
-
- fp = fopen("/proc/meminfo", "r");
- if (fp == NULL) {
- fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
- return NULL;
- }
-
- if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
- fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
- fclose(fp);
- return NULL;
- }
- fclose(fp);
-
- if ((match = strstr(buf, "SwapTotal")) == NULL)
- return NULL;
- sscanf(match, "SwapTotal: %ld kB\n", &total);
-
- if ((match = strstr(buf, "SwapCached")) == NULL)
- return NULL;
- sscanf(match, "SwapCached: %ld kB\n", &cached);
-
- if ((match = strstr(buf, "SwapFree")) == NULL)
- return NULL;
- sscanf(match, "SwapFree: %ld kB\n", &free);
-
- return bprintf("%d", 100 * (total - free - cached) / total);
-}
-
-const char *
-swap_total(void)
-{
- long total;
- FILE *fp;
- size_t bytes_read;
- char *match;
-
- fp = fopen("/proc/meminfo", "r");
- if (fp == NULL) {
- fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
- return NULL;
- }
- if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
- fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
- fclose(fp);
- return NULL;
- }
- fclose(fp);
-
- if ((match = strstr(buf, "SwapTotal")) == NULL)
- return NULL;
- sscanf(match, "SwapTotal: %ld kB\n", &total);
-
- return bprintf("%f", (float)total / 1024 / 1024);
-}
-
-const char *
-swap_used(void)
-{
- long total, free, cached;
- FILE *fp;
- size_t bytes_read;
- char *match;
-
- fp = fopen("/proc/meminfo", "r");
- if (fp == NULL) {
- fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
- return NULL;
- }
- if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
- fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
- fclose(fp);
- return NULL;
- }
- fclose(fp);
-
- if ((match = strstr(buf, "SwapTotal")) == NULL)
- return NULL;
- sscanf(match, "SwapTotal: %ld kB\n", &total);
-
- if ((match = strstr(buf, "SwapCached")) == NULL)
- return NULL;
- sscanf(match, "SwapCached: %ld kB\n", &cached);
-
- if ((match = strstr(buf, "SwapFree")) == NULL)
- return NULL;
- sscanf(match, "SwapFree: %ld kB\n", &free);
-
- return bprintf("%f", (float)(total - free - cached) / 1024 / 1024);
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../../util.h"
-
-const char *
-temp(const char *file)
-{
- int temp;
-
- return (pscanf(file, "%d", &temp) == 1) ?
- bprintf("%d", temp / 1000) : NULL;
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/sysinfo.h>
-
-#include "../../util.h"
-
-const char *
-uptime(void)
-{
- int h;
- int m;
- int uptime = 0;
- struct sysinfo info;
-
- sysinfo(&info);
- uptime = info.uptime;
-
- h = uptime / 3600;
- m = (uptime - h * 3600) / 60;
-
- return bprintf("%dh %dm", h, m);
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <ifaddrs.h>
-#include <linux/wireless.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <limits.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-
-#include "../../util.h"
-
-const char *
-wifi_perc(const char *iface)
-{
- int i, cur;
- float perc;
- int total = 70; /* the max of /proc/net/wireless */
- char *p, *datastart;
- char path[PATH_MAX];
- char status[5];
- FILE *fp;
-
- snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, "/operstate");
- fp = fopen(path, "r");
- if (fp == NULL) {
- fprintf(stderr, "fopen '%s': %s\n", path, strerror(errno));
- return NULL;
- }
- p = fgets(status, 5, fp);
- fclose(fp);
- if(!p || strcmp(status, "up\n") != 0) {
- return NULL;
- }
-
- fp = fopen("/proc/net/wireless", "r");
- if (fp == NULL) {
- fprintf(stderr, "fopen '/proc/net/wireless': %s\n", strerror(errno));
- return NULL;
- }
-
- for (i = 0; i < 3; i++) {
- if (!(p = fgets(buf, sizeof(buf) - 1, fp)))
- break;
- }
- fclose(fp);
- if (i < 2 || !p)
- return NULL;
-
- if ((datastart = strstr(buf, iface)) == NULL)
- return NULL;
-
- datastart = (datastart+(strlen(iface)+1));
- sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &cur);
-
- perc = (float)cur / total * 100.0;
-
- return bprintf("%.0f", perc);
-}
-
-const char *
-wifi_essid(const char *iface)
-{
- static char id[IW_ESSID_MAX_SIZE+1];
- int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- struct iwreq wreq;
-
- memset(&wreq, 0, sizeof(struct iwreq));
- wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
- snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface);
-
- if (sockfd == -1) {
- fprintf(stderr, "socket 'AF_INET': %s\n", strerror(errno));
- return NULL;
- }
- wreq.u.essid.pointer = id;
- if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
- fprintf(stderr, "ioctl 'SIOCGIWESSID': %s\n", strerror(errno));
- close(sockfd);
- return NULL;
- }
-
- close(sockfd);
-
- if (strcmp(id, "") == 0)
- return NULL;
- else
- return id;
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <machine/apmvar.h>
-
-#include "../../util.h"
-
-const char *
-battery_perc(const char *null)
-{
- struct apm_power_info apm_info;
- int fd;
-
- fd = open("/dev/apm", O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "open '/dev/apm': %s\n", strerror(errno));
- return NULL;
- }
-
- if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) {
- fprintf(stderr, "ioctl 'APM_IOC_GETPOWER': %s\n", strerror(errno));
- close(fd);
- return NULL;
- }
- close(fd);
-
- return bprintf("%d", apm_info.battery_life);
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/sysctl.h>
-
-#include "../../util.h"
-
-const char *
-cpu_freq(void)
-{
- int freq, mib[2];
- size_t size;
-
- mib[0] = CTL_HW;
- mib[1] = HW_CPUSPEED;
-
- size = sizeof(freq);
-
- if (sysctl(mib, 2, &freq, &size, NULL, 0) == -1) {
- fprintf(stderr, "sysctl 'HW_CPUSPEED': %s\n", strerror(errno));
- return NULL;
- }
-
- return bprintf("%d", freq);
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "../../util.h"
-
-inline int
-load_uvmexp(struct uvmexp *uvmexp)
-{
- int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
- size_t size;
-
- size = sizeof(*uvmexp);
-
- return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0;
-}
-
-const char *
-ram_free(void)
-{
- struct uvmexp uvmexp;
- float free;
- int free_pages;
-
- if (load_uvmexp(&uvmexp)) {
- free_pages = uvmexp.npages - uvmexp.active;
- free = (double) (free_pages * uvmexp.pagesize) / 1024 / 1024 / 1024;
- return bprintf("%f", free);
- }
-
- return NULL;
-}
-
-const char *
-ram_perc(void)
-{
- struct uvmexp uvmexp;
- int percent;
-
- if (load_uvmexp(&uvmexp)) {
- percent = uvmexp.active * 100 / uvmexp.npages;
- return bprintf("%d", percent);
- }
-
- return NULL;
-}
-
-const char *
-ram_total(void)
-{
- struct uvmexp uvmexp;
- float total;
-
- if (load_uvmexp(&uvmexp)) {
- total = (double) (uvmexp.npages * uvmexp.pagesize) / 1024 / 1024 / 1024;
- return bprintf("%f", total);
- }
-
- return NULL;
-}
-
-const char *
-ram_used(void)
-{
- struct uvmexp uvmexp;
- float used;
-
- if (load_uvmexp(&uvmexp)) {
- used = (double) (uvmexp.active * uvmexp.pagesize) / 1024 / 1024 / 1024;
- return bprintf("%f", used);
- }
-
- return NULL;
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-#include <sys/sensors.h>
-
-#include "../../util.h"
-
-const char *
-temp(const char *null)
-{
- int mib[5];
- size_t size;
- struct sensor temp;
-
- mib[0] = CTL_HW;
- mib[1] = HW_SENSORS;
- mib[2] = 0; /* cpu0 */
- mib[3] = SENSOR_TEMP;
- mib[4] = 0; /* temp0 */
-
- size = sizeof(temp);
-
- if (sysctl(mib, 5, &temp, &size, NULL, 0) == -1) {
- fprintf(stderr, "sysctl 'SENSOR_TEMP': %s\n", strerror(errno));
- return NULL;
- }
-
- return bprintf("%d", (temp.value - 273150000) / 1000000); /* kelvin to celsius */
-}
+++ /dev/null
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-
-#include "../../util.h"
-
-const char *
-uptime(void)
-{
- int h;
- int m;
- int uptime = 0;
-
- int mib[2];
- size_t size;
- time_t now;
- struct timeval boottime;
-
- time(&now);
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_BOOTTIME;
-
- size = sizeof(boottime);
-
- if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1)
- uptime = now - boottime.tv_sec;
- else {
- fprintf(stderr, "sysctl 'KERN_BOOTTIME': %s\n", strerror(errno));
- return NULL;
- }
-
- h = uptime / 3600;
- m = (uptime - h * 3600) / 60;
-
- return bprintf("%dh %dm", h, m);
-}
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#if defined(__linux__)
+#include <limits.h>
+#include <string.h>
+#elif defined(__OpenBSD__)
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <machine/apmvar.h>
+#endif
+
+#include "../util.h"
+
+#if defined(__linux__)
+const char *
+battery_perc(const char *bat)
+{
+ int perc;
+ char path[PATH_MAX];
+
+ snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/capacity");
+ return (pscanf(path, "%i", &perc) == 1) ?
+ bprintf("%d", perc) : NULL;
+}
+#elif defined(__OpenBSD__)
+const char *
+battery_perc(const char *null)
+{
+ struct apm_power_info apm_info;
+ int fd;
+
+ fd = open("/dev/apm", O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "open '/dev/apm': %s\n", strerror(errno));
+ return NULL;
+ }
+
+ if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) {
+ fprintf(stderr, "ioctl 'APM_IOC_GETPOWER': %s\n", strerror(errno));
+ close(fd);
+ return NULL;
+ }
+ close(fd);
+
+ return bprintf("%d", apm_info.battery_life);
+}
+#endif
+
+#if defined(__linux__)
+const char *
+battery_power(const char *bat)
+{
+ int watts;
+ char path[PATH_MAX];
+
+ snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/power_now");
+ return (pscanf(path, "%i", &watts) == 1) ?
+ bprintf("%d", (watts + 500000) / 1000000) : NULL;
+}
+
+const char *
+battery_state(const char *bat)
+{
+ struct {
+ char *state;
+ char *symbol;
+ } map[] = {
+ { "Charging", "+" },
+ { "Discharging", "-" },
+ { "Full", "=" },
+ { "Unknown", "/" },
+ };
+ size_t i;
+ char path[PATH_MAX], state[12];
+
+ snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/status");
+ if (pscanf(path, "%12s", state) != 1) {
+ return NULL;
+ }
+
+ for (i = 0; i < LEN(map); i++) {
+ if (!strcmp(map[i].state, state)) {
+ break;
+ }
+ }
+ return (i == LEN(map)) ? "?" : map[i].symbol;
+}
+#endif
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#if defined(__OpenBSD__)
+#include <sys/sysctl.h>
+#endif
+
+#include "../util.h"
+
+#if defined(__linux__)
+const char *
+cpu_freq(void)
+{
+ int freq;
+
+ return (pscanf("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq",
+ "%i", &freq) == 1) ?
+ bprintf("%d", (freq + 500) / 1000) : NULL;
+}
+
+const char *
+cpu_perc(void)
+{
+ int perc;
+ static long double a[7];
+ static int valid;
+ long double b[7];
+
+ memcpy(b, a, sizeof(b));
+ if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
+ &a[3], &a[4], &a[5], &a[6]) != 7) {
+ return NULL;
+ }
+ if (!valid) {
+ valid = 1;
+ return NULL;
+ }
+
+ perc = 100 * ((b[0]+b[1]+b[2]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[5]+a[6])) /
+ ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
+
+ return bprintf("%d", perc);
+}
+
+const char *
+cpu_iowait(void)
+{
+ int perc;
+ static int valid;
+ static long double a[7];
+ long double b[7];
+
+ memcpy(b, a, sizeof(b));
+ if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
+ &a[3], &a[4], &a[5], &a[6]) != 7) {
+ return NULL;
+ }
+ if (!valid) {
+ valid = 1;
+ return NULL;
+ }
+
+ perc = 100 * ((b[4]) - (a[4])) /
+ ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
+
+ return bprintf("%d", perc);
+}
+#elif defined(__OpenBSD__)
+const char *
+cpu_freq(void)
+{
+ int freq, mib[2];
+ size_t size;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_CPUSPEED;
+
+ size = sizeof(freq);
+
+ if (sysctl(mib, 2, &freq, &size, NULL, 0) == -1) {
+ fprintf(stderr, "sysctl 'HW_CPUSPEED': %s\n", strerror(errno));
+ return NULL;
+ }
+
+ return bprintf("%d", freq);
+}
+#endif
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#if defined(__linux__)
+#include <stdio.h>
+
+#include "../util.h"
+
+const char *
+entropy(void)
+{
+ int num;
+
+ return (pscanf("/proc/sys/kernel/random/entropy_avail", "%d", &num) == 1) ?
+ bprintf("%d", num) : NULL;
+}
+#endif
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#include <stdio.h>
+#if defined (__OpenBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#endif
+
+#include "../util.h"
+
+#if defined(__linux__)
+const char *
+ram_free(void)
+{
+ long free;
+
+ return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ?
+ bprintf("%f", (float)free / 1024 / 1024) : NULL;
+}
+
+const char *
+ram_perc(void)
+{
+ long total, free, buffers, cached;
+
+ return (pscanf("/proc/meminfo",
+ "MemTotal: %ld kB\n"
+ "MemFree: %ld kB\n"
+ "MemAvailable: %ld kB\nBuffers: %ld kB\n"
+ "Cached: %ld kB\n",
+ &total, &free, &buffers, &buffers, &cached) == 5) ?
+ bprintf("%d", 100 * ((total - free) - (buffers + cached)) / total) :
+ NULL;
+}
+
+const char *
+ram_total(void)
+{
+ long total;
+
+ return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ?
+ bprintf("%f", (float)total / 1024 / 1024) : NULL;
+}
+
+const char *
+ram_used(void)
+{
+ long total, free, buffers, cached;
+
+ return (pscanf("/proc/meminfo",
+ "MemTotal: %ld kB\n"
+ "MemFree: %ld kB\n"
+ "MemAvailable: %ld kB\nBuffers: %ld kB\n"
+ "Cached: %ld kB\n",
+ &total, &free, &buffers, &buffers, &cached) == 5) ?
+ bprintf("%f", (float)(total - free - buffers - cached) / 1024 / 1024) :
+ NULL;
+}
+#elif defined(__OpenBSD__)
+inline int
+load_uvmexp(struct uvmexp *uvmexp)
+{
+ int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
+ size_t size;
+
+ size = sizeof(*uvmexp);
+
+ return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0;
+}
+
+const char *
+ram_free(void)
+{
+ struct uvmexp uvmexp;
+ float free;
+ int free_pages;
+
+ if (load_uvmexp(&uvmexp)) {
+ free_pages = uvmexp.npages - uvmexp.active;
+ free = (double) (free_pages * uvmexp.pagesize) / 1024 / 1024 / 1024;
+ return bprintf("%f", free);
+ }
+
+ return NULL;
+}
+
+const char *
+ram_perc(void)
+{
+ struct uvmexp uvmexp;
+ int percent;
+
+ if (load_uvmexp(&uvmexp)) {
+ percent = uvmexp.active * 100 / uvmexp.npages;
+ return bprintf("%d", percent);
+ }
+
+ return NULL;
+}
+
+const char *
+ram_total(void)
+{
+ struct uvmexp uvmexp;
+ float total;
+
+ if (load_uvmexp(&uvmexp)) {
+ total = (double) (uvmexp.npages * uvmexp.pagesize) / 1024 / 1024 / 1024;
+ return bprintf("%f", total);
+ }
+
+ return NULL;
+}
+
+const char *
+ram_used(void)
+{
+ struct uvmexp uvmexp;
+ float used;
+
+ if (load_uvmexp(&uvmexp)) {
+ used = (double) (uvmexp.active * uvmexp.pagesize) / 1024 / 1024 / 1024;
+ return bprintf("%f", used);
+ }
+
+ return NULL;
+}
+#endif
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#if defined(__linux__)
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../util.h"
+
+const char *
+swap_free(void)
+{
+ long total, free;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
+ return NULL;
+ }
+
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
+ fclose(fp);
+ return NULL;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return NULL;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ if ((match = strstr(buf, "SwapFree")) == NULL)
+ return NULL;
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return bprintf("%f", (float)free / 1024 / 1024);
+}
+
+const char *
+swap_perc(void)
+{
+ long total, free, cached;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
+ return NULL;
+ }
+
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
+ fclose(fp);
+ return NULL;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return NULL;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ if ((match = strstr(buf, "SwapCached")) == NULL)
+ return NULL;
+ sscanf(match, "SwapCached: %ld kB\n", &cached);
+
+ if ((match = strstr(buf, "SwapFree")) == NULL)
+ return NULL;
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return bprintf("%d", 100 * (total - free - cached) / total);
+}
+
+const char *
+swap_total(void)
+{
+ long total;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
+ return NULL;
+ }
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
+ fclose(fp);
+ return NULL;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return NULL;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ return bprintf("%f", (float)total / 1024 / 1024);
+}
+
+const char *
+swap_used(void)
+{
+ long total, free, cached;
+ FILE *fp;
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno));
+ return NULL;
+ }
+ if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) {
+ fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno));
+ fclose(fp);
+ return NULL;
+ }
+ fclose(fp);
+
+ if ((match = strstr(buf, "SwapTotal")) == NULL)
+ return NULL;
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ if ((match = strstr(buf, "SwapCached")) == NULL)
+ return NULL;
+ sscanf(match, "SwapCached: %ld kB\n", &cached);
+
+ if ((match = strstr(buf, "SwapFree")) == NULL)
+ return NULL;
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return bprintf("%f", (float)(total - free - cached) / 1024 / 1024);
+}
+#endif
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#if defined(__OpenBSD__)
+#include <sys/sysctl.h>
+#include <sys/time.h>
+#include <sys/sensors.h>
+#endif
+
+#include "../util.h"
+
+#if defined(__linux__)
+const char *
+temp(const char *file)
+{
+ int temp;
+
+ return (pscanf(file, "%d", &temp) == 1) ?
+ bprintf("%d", temp / 1000) : NULL;
+}
+#elif defined(__OpenBSD__)
+const char *
+temp(const char *null)
+{
+ int mib[5];
+ size_t size;
+ struct sensor temp;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_SENSORS;
+ mib[2] = 0; /* cpu0 */
+ mib[3] = SENSOR_TEMP;
+ mib[4] = 0; /* temp0 */
+
+ size = sizeof(temp);
+
+ if (sysctl(mib, 5, &temp, &size, NULL, 0) == -1) {
+ fprintf(stderr, "sysctl 'SENSOR_TEMP': %s\n", strerror(errno));
+ return NULL;
+ }
+
+ return bprintf("%d", (temp.value - 273150000) / 1000000); /* kelvin to celsius */
+}
+#endif
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#if defined(__linux__)
+#include <sys/sysinfo.h>
+#elif defined(__OpenBSD__)
+#include <sys/sysctl.h>
+#include <sys/time.h>
+#endif
+
+#include "../util.h"
+
+#if defined(__linux__)
+const char *
+uptime(void)
+{
+ int h;
+ int m;
+ int uptime = 0;
+ struct sysinfo info;
+
+ sysinfo(&info);
+ uptime = info.uptime;
+
+ h = uptime / 3600;
+ m = (uptime - h * 3600) / 60;
+
+ return bprintf("%dh %dm", h, m);
+}
+#elif defined(__OpenBSD__)
+const char *
+uptime(void)
+{
+ int h;
+ int m;
+ int uptime = 0;
+
+ int mib[2];
+ size_t size;
+ time_t now;
+ struct timeval boottime;
+
+ time(&now);
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_BOOTTIME;
+
+ size = sizeof(boottime);
+
+ if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1)
+ uptime = now - boottime.tv_sec;
+ else {
+ fprintf(stderr, "sysctl 'KERN_BOOTTIME': %s\n", strerror(errno));
+ return NULL;
+ }
+
+ h = uptime / 3600;
+ m = (uptime - h * 3600) / 60;
+
+ return bprintf("%dh %dm", h, m);
+}
+#endif
--- /dev/null
+/* See LICENSE file for copyright and license details. */
+#if defined(__linux__)
+#include <errno.h>
+#include <ifaddrs.h>
+#include <linux/wireless.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "../util.h"
+
+const char *
+wifi_perc(const char *iface)
+{
+ int i, cur;
+ float perc;
+ int total = 70; /* the max of /proc/net/wireless */
+ char *p, *datastart;
+ char path[PATH_MAX];
+ char status[5];
+ FILE *fp;
+
+ snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, "/operstate");
+ fp = fopen(path, "r");
+ if (fp == NULL) {
+ fprintf(stderr, "fopen '%s': %s\n", path, strerror(errno));
+ return NULL;
+ }
+ p = fgets(status, 5, fp);
+ fclose(fp);
+ if(!p || strcmp(status, "up\n") != 0) {
+ return NULL;
+ }
+
+ fp = fopen("/proc/net/wireless", "r");
+ if (fp == NULL) {
+ fprintf(stderr, "fopen '/proc/net/wireless': %s\n", strerror(errno));
+ return NULL;
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (!(p = fgets(buf, sizeof(buf) - 1, fp)))
+ break;
+ }
+ fclose(fp);
+ if (i < 2 || !p)
+ return NULL;
+
+ if ((datastart = strstr(buf, iface)) == NULL)
+ return NULL;
+
+ datastart = (datastart+(strlen(iface)+1));
+ sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &cur);
+
+ perc = (float)cur / total * 100.0;
+
+ return bprintf("%.0f", perc);
+}
+
+const char *
+wifi_essid(const char *iface)
+{
+ static char id[IW_ESSID_MAX_SIZE+1];
+ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ struct iwreq wreq;
+
+ memset(&wreq, 0, sizeof(struct iwreq));
+ wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
+ snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface);
+
+ if (sockfd == -1) {
+ fprintf(stderr, "socket 'AF_INET': %s\n", strerror(errno));
+ return NULL;
+ }
+ wreq.u.essid.pointer = id;
+ if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
+ fprintf(stderr, "ioctl 'SIOCGIWESSID': %s\n", strerror(errno));
+ close(sockfd);
+ return NULL;
+ }
+
+ close(sockfd);
+
+ if (strcmp(id, "") == 0)
+ return NULL;
+ else
+ return id;
+}
+#endif
# customize below to fit your system
# paths
-PREFIX = /usr/local
+PREFIX = /usr/local
MANPREFIX = ${PREFIX}/share/man
X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
+# OpenBSD (uncomment)
+#OSSLIBS = -lossaudio
+
# flags
+CPPFLAGS = -I$(X11INC) -D_DEFAULT_SOURCE
CFLAGS = -std=c99 -pedantic -Wall -Wextra -Os
-LDFLAGS = -s
-LIBS =
+LDFLAGS = -L$(X11LIB) -s
+LDLIBS = -lX11 ${OSSLIBS}
+
+# compiler and linker
+CC = cc
+++ /dev/null
-#!/bin/sh
-
-os="$(uname)"
-
-printf 'OS = %s\n' "$os" > os.mk
-
-if [ "$os" = "OpenBSD" ]
-then
- printf 'OSLIBS = -lossaudio\n' >> os.mk
-fi