diff options
Diffstat (limited to 'components')
| -rw-r--r-- | components/datetime.c | 20 | ||||
| -rw-r--r-- | components/netspeeds.c | 74 | ||||
| -rw-r--r-- | components/ram.c | 89 | ||||
| -rw-r--r-- | components/run_command.c | 31 | ||||
| -rw-r--r-- | components/volume | 4 |
5 files changed, 218 insertions, 0 deletions
diff --git a/components/datetime.c b/components/datetime.c new file mode 100644 index 0000000..5b10daf --- /dev/null +++ b/components/datetime.c @@ -0,0 +1,20 @@ +/* See LICENSE file for copyright and license details. */ +#include <stdio.h> +#include <time.h> + +#include "../slstatus.h" +#include "../util.h" + +const char * +datetime(const char *fmt) +{ + time_t t; + + t = time(NULL); + if (!strftime(buf, sizeof(buf), fmt, localtime(&t))) { + warn("strftime: Result string exceeds buffer size"); + return NULL; + } + + return buf; +} diff --git a/components/netspeeds.c b/components/netspeeds.c new file mode 100644 index 0000000..b61b4c9 --- /dev/null +++ b/components/netspeeds.c @@ -0,0 +1,74 @@ +/* See LICENSE file for copyright and license details. */ +#include <limits.h> +#include <stdio.h> + +#include "../slstatus.h" +#include "../util.h" + +#if defined(__linux__) + #include <stdint.h> + + #define NET_RX_BYTES "/sys/class/net/%s/statistics/rx_bytes" + + const char * + netspeed_rx(const char *interface) + { + uintmax_t oldrxbytes; + static uintmax_t rxbytes; + extern const unsigned int interval; + char path[PATH_MAX]; + + oldrxbytes = rxbytes; + + if (esnprintf(path, sizeof(path), NET_RX_BYTES, interface) < 0) + return NULL; + if (pscanf(path, "%ju", &rxbytes) != 1) + return NULL; + if (oldrxbytes == 0) + return NULL; + + return fmt_human((rxbytes - oldrxbytes) * 1000 / interval, + 1024); + } + +#elif defined(__OpenBSD__) | defined(__FreeBSD__) + #include <ifaddrs.h> + #include <net/if.h> + #include <string.h> + #include <sys/types.h> + #include <sys/socket.h> + + const char * + netspeed_tx(const char *interface) + { + struct ifaddrs *ifal, *ifa; + struct if_data *ifd; + uintmax_t oldtxbytes; + static uintmax_t txbytes; + extern const unsigned int interval; + int if_ok = 0; + + oldtxbytes = txbytes; + + if (getifaddrs(&ifal) < 0) { + warn("getifaddrs failed"); + return NULL; + } + txbytes = 0; + for (ifa = ifal; ifa; ifa = ifa->ifa_next) + if (!strcmp(ifa->ifa_name, interface) && + (ifd = (struct if_data *)ifa->ifa_data)) + txbytes += ifd->ifi_obytes, if_ok = 1; + + freeifaddrs(ifal); + if (!if_ok) { + warn("reading 'if_data' failed"); + return NULL; + } + if (oldtxbytes == 0) + return NULL; + + return fmt_human((txbytes - oldtxbytes) * 1000 / interval, + 1024); + } +#endif diff --git a/components/ram.c b/components/ram.c new file mode 100644 index 0000000..da2021f --- /dev/null +++ b/components/ram.c @@ -0,0 +1,89 @@ +/* See LICENSE file for copyright and license details. */ +#include <stdio.h> + +#include "../slstatus.h" +#include "../util.h" + +#if defined(__linux__) + #include <stdint.h> + + const char * + ram_perc(const char *unused) + { + uintmax_t total, free, buffers, cached; + int percent; + + if (pscanf("/proc/meminfo", + "MemTotal: %ju kB\n" + "MemFree: %ju kB\n" + "MemAvailable: %ju kB\n" + "Buffers: %ju kB\n" + "Cached: %ju kB\n", + &total, &free, &buffers, &buffers, &cached) != 5) + return NULL; + + if (total == 0) + return NULL; + + percent = 100 * ((total - free) - (buffers + cached)) / total; + return bprintf("%d", percent); + } +#elif defined(__OpenBSD__) + #include <stdlib.h> + #include <sys/sysctl.h> + #include <sys/types.h> + #include <unistd.h> + + #define LOG1024 10 + #define pagetok(size, pageshift) (size_t)(size << (pageshift - LOG1024)) + + inline int + load_uvmexp(struct uvmexp *uvmexp) + { + int uvmexp_mib[] = {CTL_VM, VM_UVMEXP}; + size_t size; + + size = sizeof(*uvmexp); + + if (sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0) + return 1; + + return 0; + } + + const char * + ram_perc(const char *unused) + { + struct uvmexp uvmexp; + int percent; + + if (!load_uvmexp(&uvmexp)) + return NULL; + + percent = uvmexp.active * 100 / uvmexp.npages; + return bprintf("%d", percent); + } +#elif defined(__FreeBSD__) + #include <sys/sysctl.h> + #include <sys/vmmeter.h> + #include <unistd.h> + #include <vm/vm_param.h> + + const char * + ram_perc(const char *unused) { + unsigned int npages; + unsigned int active; + size_t len; + + len = sizeof(npages); + if (sysctlbyname("vm.stats.vm.v_page_count", + &npages, &len, NULL, 0) < 0 || !len) + return NULL; + + if (sysctlbyname("vm.stats.vm.v_active_count", + &active, &len, NULL, 0) < 0 || !len) + return NULL; + + return bprintf("%d", active * 100 / npages); + } +#endif diff --git a/components/run_command.c b/components/run_command.c new file mode 100644 index 0000000..93bf6da --- /dev/null +++ b/components/run_command.c @@ -0,0 +1,31 @@ +/* See LICENSE file for copyright and license details. */ +#include <stdio.h> +#include <string.h> + +#include "../slstatus.h" +#include "../util.h" + +const char * +run_command(const char *cmd) +{ + char *p; + FILE *fp; + + if (!(fp = popen(cmd, "r"))) { + warn("popen '%s':", cmd); + return NULL; + } + + p = fgets(buf, sizeof(buf) - 1, fp); + if (pclose(fp) < 0) { + warn("pclose '%s':", cmd); + return NULL; + } + if (!p) + return NULL; + + if ((p = strrchr(buf, '\n'))) + p[0] = '\0'; + + return buf[0] ? buf : NULL; +} diff --git a/components/volume b/components/volume new file mode 100644 index 0000000..3249774 --- /dev/null +++ b/components/volume @@ -0,0 +1,4 @@ +#!/bin/sh + +vol="$(pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,')" +[ "$vol" = "0" ] && echo "ﱝ muted" || echo "墳 ${vol}%" |
