# 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