From 6820631175868c277effa7cc05f9cb3197b72654 Mon Sep 17 00:00:00 2001 From: Aaron Marcher Date: Sun, 17 Sep 2017 16:18:17 +0200 Subject: [PATCH] Split into multiple files For multiple reasons the program is now split: - Make future porting to OpenBSD easier - Assign header includes to individiual functions - Make future program extensions easier - Recompile only changed parts --- battery.c | 55 ++++ cpu.c | 62 ++++ datetime.c | 15 + disk.c | 60 ++++ entropy.c | 12 + hostname.c | 15 + ip.c | 69 ++++ kernel_release.c | 16 + keyboard_indicators.c | 29 ++ load_avg.c | 17 + num_files.c | 29 ++ ram.c | 51 +++ run_command.c | 26 ++ slstatus.c | 741 +----------------------------------------- swap.c | 135 ++++++++ temperature.c | 12 + uptime.c | 17 + user.c | 31 ++ util.c | 42 +++ util.h | 6 + volume.c | 42 +++ wifi.c | 84 +++++ 22 files changed, 826 insertions(+), 740 deletions(-) create mode 100644 battery.c create mode 100644 cpu.c create mode 100644 datetime.c create mode 100644 disk.c create mode 100644 entropy.c create mode 100644 hostname.c create mode 100644 ip.c create mode 100644 kernel_release.c create mode 100644 keyboard_indicators.c create mode 100644 load_avg.c create mode 100644 num_files.c create mode 100644 ram.c create mode 100644 run_command.c create mode 100644 swap.c create mode 100644 temperature.c create mode 100644 uptime.c create mode 100644 user.c create mode 100644 util.c create mode 100644 util.h create mode 100644 volume.c create mode 100644 wifi.c diff --git a/battery.c b/battery.c new file mode 100644 index 0000000..9f692ea --- /dev/null +++ b/battery.c @@ -0,0 +1,55 @@ +#include +#include +#include + +#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; +} diff --git a/cpu.c b/cpu.c new file mode 100644 index 0000000..0cc1f88 --- /dev/null +++ b/cpu.c @@ -0,0 +1,62 @@ +#include +#include + +#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); +} diff --git a/datetime.c b/datetime.c new file mode 100644 index 0000000..0f7dab4 --- /dev/null +++ b/datetime.c @@ -0,0 +1,15 @@ +#include + +#include "util.h" + +const char * +datetime(const char *fmt) +{ + time_t t; + + t = time(NULL); + if (strftime(buf, sizeof(buf), fmt, localtime(&t)) == 0) + return NULL; + + return buf; +} diff --git a/disk.c b/disk.c new file mode 100644 index 0000000..9fd26fc --- /dev/null +++ b/disk.c @@ -0,0 +1,60 @@ +#include +#include +#include + +#include "util.h" + +const char * +disk_free(const char *mnt) +{ + struct statvfs fs; + + if (statvfs(mnt, &fs) < 0) { + warn("Failed to get filesystem info"); + return NULL; + } + + return bprintf("%f", (float)fs.f_bsize * (float)fs.f_bfree / 1024 / 1024 / 1024); +} + +const char * +disk_perc(const char *mnt) +{ + int perc; + struct statvfs fs; + + if (statvfs(mnt, &fs) < 0) { + warn("Failed to get filesystem info"); + return NULL; + } + + perc = 100 * (1.0f - ((float)fs.f_bfree / (float)fs.f_blocks)); + + return bprintf("%d", perc); +} + +const char * +disk_total(const char *mnt) +{ + struct statvfs fs; + + if (statvfs(mnt, &fs) < 0) { + warn("Failed to get filesystem info"); + return NULL; + } + + return bprintf("%f", (float)fs.f_bsize * (float)fs.f_blocks / 1024 / 1024 / 1024); +} + +const char * +disk_used(const char *mnt) +{ + struct statvfs fs; + + if (statvfs(mnt, &fs) < 0) { + warn("Failed to get filesystem info"); + return NULL; + } + + return bprintf("%f", (float)fs.f_bsize * ((float)fs.f_blocks - (float)fs.f_bfree) / 1024 / 1024 / 1024); +} diff --git a/entropy.c b/entropy.c new file mode 100644 index 0000000..b0f879a --- /dev/null +++ b/entropy.c @@ -0,0 +1,12 @@ +#include + +#include "util.h" + +const char * +entropy(void) +{ + int num; + + return (pscanf("/proc/sys/kernel/random/entropy_avail", "%d", &num) == 1) ? + bprintf("%d", num) : NULL; +} diff --git a/hostname.c b/hostname.c new file mode 100644 index 0000000..23c5a16 --- /dev/null +++ b/hostname.c @@ -0,0 +1,15 @@ +#include +#include + +#include "util.h" + +const char * +hostname(void) +{ + if (gethostname(buf, sizeof(buf)) == -1) { + warn("hostname"); + return NULL; + } + + return buf; +} diff --git a/ip.c b/ip.c new file mode 100644 index 0000000..600fb86 --- /dev/null +++ b/ip.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include + +#include "util.h" + +const char * +ipv4(const char *iface) +{ + struct ifaddrs *ifaddr, *ifa; + int s; + char host[NI_MAXHOST]; + + if (getifaddrs(&ifaddr) == -1) { + warn("Failed to get IPv4 address for interface %s", iface); + return NULL; + } + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) { + continue; + } + s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET)) { + if (s != 0) { + warnx("Failed to get IPv4 address for interface %s", iface); + return NULL; + } + return bprintf("%s", host); + } + } + + freeifaddrs(ifaddr); + + return NULL; +} + +const char * +ipv6(const char *iface) +{ + struct ifaddrs *ifaddr, *ifa; + int s; + char host[NI_MAXHOST]; + + if (getifaddrs(&ifaddr) == -1) { + warn("Failed to get IPv6 address for interface %s", iface); + return NULL; + } + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) { + continue; + } + s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET6)) { + if (s != 0) { + warnx("Failed to get IPv6 address for interface %s", iface); + return NULL; + } + return bprintf("%s", host); + } + } + + freeifaddrs(ifaddr); + + return NULL; +} diff --git a/kernel_release.c b/kernel_release.c new file mode 100644 index 0000000..64f1463 --- /dev/null +++ b/kernel_release.c @@ -0,0 +1,16 @@ +#include +#include + +#include "util.h" + +const char * +kernel_release(void) +{ + struct utsname udata; + + if (uname(&udata) < 0) { + return NULL; + } + + return bprintf("%s", udata.release); +} diff --git a/keyboard_indicators.c b/keyboard_indicators.c new file mode 100644 index 0000000..4aeae0d --- /dev/null +++ b/keyboard_indicators.c @@ -0,0 +1,29 @@ +#include +#include + +#include "util.h" + +const char * +keyboard_indicators(void) +{ + Display *dpy = XOpenDisplay(NULL); + XKeyboardState state; + + if (dpy == NULL) { + warnx("XOpenDisplay failed"); + return NULL; + } + XGetKeyboardControl(dpy, &state); + XCloseDisplay(dpy); + + switch (state.led_mask) { + case 1: + return "c"; + case 2: + return "n"; + case 3: + return "cn"; + default: + return ""; + } +} diff --git a/load_avg.c b/load_avg.c new file mode 100644 index 0000000..7342ae9 --- /dev/null +++ b/load_avg.c @@ -0,0 +1,17 @@ +#include +#include + +#include "util.h" + +const char * +load_avg(const char *fmt) +{ + double avgs[3]; + + if (getloadavg(avgs, 3) < 0) { + warnx("Failed to get the load avg"); + return NULL; + } + + return bprintf(fmt, avgs[0], avgs[1], avgs[2]); +} diff --git a/num_files.c b/num_files.c new file mode 100644 index 0000000..505e24a --- /dev/null +++ b/num_files.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +#include "util.h" + +const char * +num_files(const char *dir) +{ + struct dirent *dp; + DIR *fd; + int num = 0; + + if ((fd = opendir(dir)) == NULL) { + warn("Failed to get number of files in directory %s", dir); + return NULL; + } + + while ((dp = readdir(fd)) != NULL) { + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) + continue; /* skip self and parent */ + num++; + } + + closedir(fd); + + return bprintf("%d", num); +} diff --git a/ram.c b/ram.c new file mode 100644 index 0000000..8f7c682 --- /dev/null +++ b/ram.c @@ -0,0 +1,51 @@ +#include + +#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; +} diff --git a/run_command.c b/run_command.c new file mode 100644 index 0000000..26f1f17 --- /dev/null +++ b/run_command.c @@ -0,0 +1,26 @@ +#include +#include +#include + +#include "util.h" + +const char * +run_command(const char *cmd) +{ + char *p; + FILE *fp; + + fp = popen(cmd, "r"); + if (fp == NULL) { + warn("Failed to get command output for %s", cmd); + return NULL; + } + p = fgets(buf, sizeof(buf) - 1, fp); + pclose(fp); + if (!p) + return NULL; + if ((p = strrchr(buf, '\n')) != NULL) + p[0] = '\0'; + + return buf[0] ? buf : NULL; +} diff --git a/slstatus.c b/slstatus.c index d17bae7..c7e9303 100644 --- a/slstatus.c +++ b/slstatus.c @@ -1,34 +1,16 @@ /* See LICENSE file for copyright and license details. */ -#include #include #include -#include -#include -#include -#include #include -#include -#include #include -#include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include #include #include "arg.h" - -#define LEN(x) (sizeof (x) / sizeof *(x)) +#include "util.h" struct arg { const char *(*func)(); @@ -79,727 +61,6 @@ static Display *dpy; #include "config.h" -static char buf[MAXLEN]; - -static const char * -bprintf(const char *fmt, ...) -{ - va_list ap; - size_t len; - - va_start(ap, fmt); - len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap); - va_end(ap); - - if (len >= sizeof(buf)) - buf[sizeof(buf)-1] = '\0'; - - return buf; -} - -int -pscanf(const char *path, const char *fmt, ...) -{ - FILE *fp; - va_list ap; - int n; - - if (!(fp = fopen(path, "r"))) { - warn("fopen %s: %s\n", path, strerror(errno)); - return -1; - } - va_start(ap, fmt); - n = vfscanf(fp, fmt, ap); - va_end(ap); - fclose(fp); - - return (n == EOF) ? -1 : n; -} - -static 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) : unknown_str; -} - -static 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) : unknown_str; -} - -static 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 unknown_str; - } - - for (i = 0; i < LEN(map); i++) { - if (!strcmp(map[i].state, state)) { - break; - } - } - return (i == LEN(map)) ? "?" : map[i].symbol; -} - -static 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) : unknown_str; -} - -static 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 unknown_str; - } - if (!valid) { - valid = 1; - return unknown_str; - } - - 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); -} - -static 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 unknown_str; - } - if (!valid) { - valid = 1; - return unknown_str; - } - - 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); -} - -static const char * -datetime(const char *fmt) -{ - time_t t; - - t = time(NULL); - if (strftime(buf, sizeof(buf), fmt, localtime(&t)) == 0) - return unknown_str; - - return buf; -} - -static const char * -disk_free(const char *mnt) -{ - struct statvfs fs; - - if (statvfs(mnt, &fs) < 0) { - warn("Failed to get filesystem info"); - return unknown_str; - } - - return bprintf("%f", (float)fs.f_bsize * (float)fs.f_bfree / 1024 / 1024 / 1024); -} - -static const char * -disk_perc(const char *mnt) -{ - int perc; - struct statvfs fs; - - if (statvfs(mnt, &fs) < 0) { - warn("Failed to get filesystem info"); - return unknown_str; - } - - perc = 100 * (1.0f - ((float)fs.f_bfree / (float)fs.f_blocks)); - - return bprintf("%d", perc); -} - -static const char * -disk_total(const char *mnt) -{ - struct statvfs fs; - - if (statvfs(mnt, &fs) < 0) { - warn("Failed to get filesystem info"); - return unknown_str; - } - - return bprintf("%f", (float)fs.f_bsize * (float)fs.f_blocks / 1024 / 1024 / 1024); -} - -static const char * -disk_used(const char *mnt) -{ - struct statvfs fs; - - if (statvfs(mnt, &fs) < 0) { - warn("Failed to get filesystem info"); - return unknown_str; - } - - return bprintf("%f", (float)fs.f_bsize * ((float)fs.f_blocks - (float)fs.f_bfree) / 1024 / 1024 / 1024); -} - -static const char * -entropy(void) -{ - int num; - - return (pscanf("/proc/sys/kernel/random/entropy_avail", "%d", &num) == 1) ? - bprintf("%d", num) : unknown_str; -} - -static const char * -gid(void) -{ - return bprintf("%d", getgid()); -} - -static const char * -hostname(void) -{ - if (gethostname(buf, sizeof(buf)) == -1) { - warn("hostname"); - return unknown_str; - } - - return buf; -} - -static const char * -ipv4(const char *iface) -{ - struct ifaddrs *ifaddr, *ifa; - int s; - char host[NI_MAXHOST]; - - if (getifaddrs(&ifaddr) == -1) { - warn("Failed to get IPv4 address for interface %s", iface); - return unknown_str; - } - - for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa->ifa_addr == NULL) { - continue; - } - s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); - if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET)) { - if (s != 0) { - warnx("Failed to get IPv4 address for interface %s", iface); - return unknown_str; - } - return bprintf("%s", host); - } - } - - freeifaddrs(ifaddr); - - return unknown_str; -} - -static const char * -ipv6(const char *iface) -{ - struct ifaddrs *ifaddr, *ifa; - int s; - char host[NI_MAXHOST]; - - if (getifaddrs(&ifaddr) == -1) { - warn("Failed to get IPv6 address for interface %s", iface); - return unknown_str; - } - - for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa->ifa_addr == NULL) { - continue; - } - s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); - if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET6)) { - if (s != 0) { - warnx("Failed to get IPv6 address for interface %s", iface); - return unknown_str; - } - return bprintf("%s", host); - } - } - - freeifaddrs(ifaddr); - - return unknown_str; -} - -static const char * -kernel_release(void) -{ - struct utsname udata; - - if (uname(&udata) < 0) { - return unknown_str; - } - - return bprintf("%s", udata.release); -} - -static const char * -keyboard_indicators(void) -{ - Display *dpy = XOpenDisplay(NULL); - XKeyboardState state; - - if (dpy == NULL) { - warnx("XOpenDisplay failed"); - return unknown_str; - } - XGetKeyboardControl(dpy, &state); - XCloseDisplay(dpy); - - switch (state.led_mask) { - case 1: - return "c"; - case 2: - return "n"; - case 3: - return "cn"; - default: - return ""; - } -} - -static const char * -load_avg(const char *fmt) -{ - double avgs[3]; - - if (getloadavg(avgs, 3) < 0) { - warnx("Failed to get the load avg"); - return unknown_str; - } - - return bprintf(fmt, avgs[0], avgs[1], avgs[2]); -} - -static const char * -num_files(const char *dir) -{ - struct dirent *dp; - DIR *fd; - int num = 0; - - if ((fd = opendir(dir)) == NULL) { - warn("Failed to get number of files in directory %s", dir); - return unknown_str; - } - - while ((dp = readdir(fd)) != NULL) { - if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) - continue; /* skip self and parent */ - num++; - } - - closedir(fd); - - return bprintf("%d", num); -} - -static const char * -ram_free(void) -{ - long free; - - return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ? - bprintf("%f", (float)free / 1024 / 1024) : unknown_str; -} - -static 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) : - unknown_str; -} - -static const char * -ram_total(void) -{ - long total; - - return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ? - bprintf("%f", (float)total / 1024 / 1024) : unknown_str; -} - -static 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) : - unknown_str; -} - -static const char * -run_command(const char *cmd) -{ - char *p; - FILE *fp; - - fp = popen(cmd, "r"); - if (fp == NULL) { - warn("Failed to get command output for %s", cmd); - return unknown_str; - } - p = fgets(buf, sizeof(buf) - 1, fp); - pclose(fp); - if (!p) - return unknown_str; - if ((p = strrchr(buf, '\n')) != NULL) - p[0] = '\0'; - - return buf[0] ? buf : unknown_str; -} - -static const char * -swap_free(void) -{ - long total, free; - FILE *fp; - size_t bytes_read; - char *match; - - fp = fopen("/proc/meminfo", "r"); - if (fp == NULL) { - warn("Failed to open file /proc/meminfo"); - return unknown_str; - } - - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { - warn("swap_free: read error"); - fclose(fp); - return unknown_str; - } - fclose(fp); - - if ((match = strstr(buf, "SwapTotal")) == NULL) - return unknown_str; - sscanf(match, "SwapTotal: %ld kB\n", &total); - - if ((match = strstr(buf, "SwapFree")) == NULL) - return unknown_str; - sscanf(match, "SwapFree: %ld kB\n", &free); - - return bprintf("%f", (float)free / 1024 / 1024); -} - -static 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) { - warn("Failed to open file /proc/meminfo"); - return unknown_str; - } - - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { - warn("swap_perc: read error"); - fclose(fp); - return unknown_str; - } - fclose(fp); - - if ((match = strstr(buf, "SwapTotal")) == NULL) - return unknown_str; - sscanf(match, "SwapTotal: %ld kB\n", &total); - - if ((match = strstr(buf, "SwapCached")) == NULL) - return unknown_str; - sscanf(match, "SwapCached: %ld kB\n", &cached); - - if ((match = strstr(buf, "SwapFree")) == NULL) - return unknown_str; - sscanf(match, "SwapFree: %ld kB\n", &free); - - return bprintf("%d", 100 * (total - free - cached) / total); -} - -static const char * -swap_total(void) -{ - long total; - FILE *fp; - size_t bytes_read; - char *match; - - fp = fopen("/proc/meminfo", "r"); - if (fp == NULL) { - warn("Failed to open file /proc/meminfo"); - return unknown_str; - } - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { - warn("swap_total: read error"); - fclose(fp); - return unknown_str; - } - fclose(fp); - - if ((match = strstr(buf, "SwapTotal")) == NULL) - return unknown_str; - sscanf(match, "SwapTotal: %ld kB\n", &total); - - return bprintf("%f", (float)total / 1024 / 1024); -} - -static 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) { - warn("Failed to open file /proc/meminfo"); - return unknown_str; - } - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { - warn("swap_used: read error"); - fclose(fp); - return unknown_str; - } - fclose(fp); - - if ((match = strstr(buf, "SwapTotal")) == NULL) - return unknown_str; - sscanf(match, "SwapTotal: %ld kB\n", &total); - - if ((match = strstr(buf, "SwapCached")) == NULL) - return unknown_str; - sscanf(match, "SwapCached: %ld kB\n", &cached); - - if ((match = strstr(buf, "SwapFree")) == NULL) - return unknown_str; - sscanf(match, "SwapFree: %ld kB\n", &free); - - return bprintf("%f", (float)(total - free - cached) / 1024 / 1024); -} - -static const char * -temp(const char *file) -{ - int temp; - - return (pscanf(file, "%d", &temp) == 1) ? - bprintf("%d", temp / 1000) : unknown_str; -} - -static const char * -uptime(void) -{ - struct sysinfo info; - int h = 0; - int m = 0; - - sysinfo(&info); - h = info.uptime / 3600; - m = (info.uptime - h * 3600 ) / 60; - - return bprintf("%dh %dm", h, m); -} - -static const char * -username(void) -{ - struct passwd *pw = getpwuid(geteuid()); - - if (pw == NULL) { - warn("Failed to get username"); - return unknown_str; - } - - return bprintf("%s", pw->pw_name); -} - -static const char * -uid(void) -{ - return bprintf("%d", geteuid()); -} - - -static const char * -vol_perc(const char *card) -{ - unsigned int i; - int v, afd, devmask; - char *vnames[] = SOUND_DEVICE_NAMES; - - afd = open(card, O_RDONLY | O_NONBLOCK); - if (afd == -1) { - warn("Cannot open %s", card); - return unknown_str; - } - - if (ioctl(afd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) { - warn("Cannot get volume for %s", card); - close(afd); - return unknown_str; - } - for (i = 0; i < LEN(vnames); i++) { - if (devmask & (1 << i) && !strcmp("vol", vnames[i])) { - if (ioctl(afd, MIXER_READ(i), &v) == -1) { - warn("vol_perc: ioctl"); - close(afd); - return unknown_str; - } - } - } - - close(afd); - - return bprintf("%d", v & 0xff); -} - -static const char * -wifi_perc(const char *iface) -{ - int i, perc; - 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) { - warn("Failed to open file %s", path); - return unknown_str; - } - p = fgets(status, 5, fp); - fclose(fp); - if(!p || strcmp(status, "up\n") != 0) { - return unknown_str; - } - - fp = fopen("/proc/net/wireless", "r"); - if (fp == NULL) { - warn("Failed to open file /proc/net/wireless"); - return unknown_str; - } - - for (i = 0; i < 3; i++) { - if (!(p = fgets(buf, sizeof(buf) - 1, fp))) - break; - } - fclose(fp); - if (i < 2 || !p) - return unknown_str; - - if ((datastart = strstr(buf, iface)) == NULL) - return unknown_str; - - datastart = (datastart+(strlen(iface)+1)); - sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &perc); - - return bprintf("%d", perc); -} - -static 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) { - warn("Failed to get ESSID for interface %s", iface); - return unknown_str; - } - wreq.u.essid.pointer = id; - if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) { - warn("Failed to get ESSID for interface %s", iface); - return unknown_str; - } - - close(sockfd); - - if (strcmp(id, "") == 0) - return unknown_str; - else - return id; -} - static void terminate(const int signo) { diff --git a/swap.c b/swap.c new file mode 100644 index 0000000..2a627c3 --- /dev/null +++ b/swap.c @@ -0,0 +1,135 @@ +#include +#include +#include + +#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) { + warn("Failed to open file /proc/meminfo"); + return NULL; + } + + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { + warn("swap_free: read error"); + 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) { + warn("Failed to open file /proc/meminfo"); + return NULL; + } + + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { + warn("swap_perc: read error"); + 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) { + warn("Failed to open file /proc/meminfo"); + return NULL; + } + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { + warn("swap_total: read error"); + 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) { + warn("Failed to open file /proc/meminfo"); + return NULL; + } + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { + warn("swap_used: read error"); + 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); +} diff --git a/temperature.c b/temperature.c new file mode 100644 index 0000000..91b871b --- /dev/null +++ b/temperature.c @@ -0,0 +1,12 @@ +#include + +#include "util.h" + +const char * +temp(const char *file) +{ + int temp; + + return (pscanf(file, "%d", &temp) == 1) ? + bprintf("%d", temp / 1000) : NULL; +} diff --git a/uptime.c b/uptime.c new file mode 100644 index 0000000..c9f4fda --- /dev/null +++ b/uptime.c @@ -0,0 +1,17 @@ +#include + +#include "util.h" + +const char * +uptime(void) +{ + struct sysinfo info; + int h = 0; + int m = 0; + + sysinfo(&info); + h = info.uptime / 3600; + m = (info.uptime - h * 3600 ) / 60; + + return bprintf("%dh %dm", h, m); +} diff --git a/user.c b/user.c new file mode 100644 index 0000000..5ab7c8e --- /dev/null +++ b/user.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +#include "util.h" + +const char * +gid(void) +{ + return bprintf("%d", getgid()); +} + +const char * +username(void) +{ + struct passwd *pw = getpwuid(geteuid()); + + if (pw == NULL) { + warn("Failed to get username"); + return NULL; + } + + return bprintf("%s", pw->pw_name); +} + +const char * +uid(void) +{ + return bprintf("%d", geteuid()); +} diff --git a/util.c b/util.c new file mode 100644 index 0000000..98c5fc5 --- /dev/null +++ b/util.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include + +#include "util.h" + +const char * +bprintf(const char *fmt, ...) +{ + va_list ap; + size_t len; + + va_start(ap, fmt); + len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap); + va_end(ap); + + if (len >= sizeof(buf)) + buf[sizeof(buf)-1] = '\0'; + + return buf; +} + +int +pscanf(const char *path, const char *fmt, ...) +{ + FILE *fp; + va_list ap; + int n; + + if (!(fp = fopen(path, "r"))) { + warn("fopen %s: %s\n", path, strerror(errno)); + return -1; + } + va_start(ap, fmt); + n = vfscanf(fp, fmt, ap); + va_end(ap); + fclose(fp); + + return (n == EOF) ? -1 : n; +} diff --git a/util.h b/util.h new file mode 100644 index 0000000..6f47e85 --- /dev/null +++ b/util.h @@ -0,0 +1,6 @@ +static char buf[1024]; + +#define LEN(x) (sizeof (x) / sizeof *(x)) + +const char *bprintf(const char *fmt, ...); +int pscanf(const char *path, const char *fmt, ...); diff --git a/volume.c b/volume.c new file mode 100644 index 0000000..a23c4f1 --- /dev/null +++ b/volume.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "util.h" + +const char * +vol_perc(const char *card) +{ + unsigned int i; + int v, afd, devmask; + char *vnames[] = SOUND_DEVICE_NAMES; + + afd = open(card, O_RDONLY | O_NONBLOCK); + if (afd == -1) { + warn("Cannot open %s", card); + return NULL; + } + + if (ioctl(afd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) { + warn("Cannot get volume for %s", card); + close(afd); + return NULL; + } + for (i = 0; i < LEN(vnames); i++) { + if (devmask & (1 << i) && !strcmp("vol", vnames[i])) { + if (ioctl(afd, MIXER_READ(i), &v) == -1) { + warn("vol_perc: ioctl"); + close(afd); + return NULL; + } + } + } + + close(afd); + + return bprintf("%d", v & 0xff); +} diff --git a/wifi.c b/wifi.c new file mode 100644 index 0000000..b0c81f9 --- /dev/null +++ b/wifi.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "util.h" + +const char * +wifi_perc(const char *iface) +{ + int i, perc; + 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) { + warn("Failed to open file %s", path); + 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) { + warn("Failed to open file /proc/net/wireless"); + 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", &perc); + + return bprintf("%d", 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) { + warn("Failed to get ESSID for interface %s", iface); + return NULL; + } + wreq.u.essid.pointer = id; + if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) { + warn("Failed to get ESSID for interface %s", iface); + return NULL; + } + + close(sockfd); + + if (strcmp(id, "") == 0) + return NULL; + else + return id; +}