X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=wmiistatus.c;h=bdb1e6a5ed8bbcc795b1815cec8f5c9ac2017711;hb=e94e25208936ab8f6ab684b1b229bc29073b955d;hp=269f68135a9d008154532809de906b929e544812;hpb=79dfdafb212e9933f32630a3548f05a4a2d786d1;p=i3%2Fi3status diff --git a/wmiistatus.c b/wmiistatus.c index 269f681..bdb1e6a 100644 --- a/wmiistatus.c +++ b/wmiistatus.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -46,8 +47,9 @@ #include #include #include -#include "wmiistatus.h" +#include +#include "wmiistatus.h" #include "config.h" static void write_to_statusbar(const char *message) { @@ -62,8 +64,14 @@ static void write_to_statusbar(const char *message) { * Write errormessage to statusbar and exit * */ -static void die(const char *message) { - write_to_statusbar(message); +static void die(const char *fmt, ...) { + char buffer[512]; + va_list ap; + va_start(ap, fmt); + vsprintf(buffer, fmt, ap); + va_end(ap); + + write_to_statusbar(buffer); exit(-1); } @@ -96,9 +104,9 @@ static char *get_battery_info() { char buf[1024]; static char part[512]; char *walk, *last = buf; - int fd = open("/sys/class/power_supply/BAT0/uevent", O_RDONLY); + int fd = open(battery, O_RDONLY); if (fd == -1) - die("Could not open /sys/class/power_supply/BAT0/uevent"); + die("Could not open %s", battery); int full_design = -1, remaining = -1, present_rate = -1; @@ -232,15 +240,52 @@ static char *get_eth_info() { return part; } +/* + * Checks if the PID in path is still valid by checking if /proc/ exists + * + */ +static bool process_runs(const char *path) { + char pidbuf[512], + procbuf[512], + *walk; + int n; + static glob_t globbuf; + struct stat statbuf; + + if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0) + die("glob() failed"); + const char *real_path = (globbuf.gl_pathc > 0 ? globbuf.gl_pathv[0] : path); + int fd = open(real_path, O_RDONLY); + globfree(&globbuf); + if (fd < 0) + return false; + n = read(fd, pidbuf, sizeof(pidbuf)); + if (n > 0) + pidbuf[n] = '\0'; + close(fd); + for (walk = pidbuf; *walk != '\0'; walk++) + if (!isdigit((int)(*walk))) { + *walk = '\0'; + break; + } + sprintf(procbuf, "/proc/%s", pidbuf); + return (stat(procbuf, &statbuf) >= 0); +} int main(void) { char part[512], *end; + unsigned int i; while (1) { memset(output, '\0', sizeof(output)); first_push = true; + for (i = 0; i < sizeof(run_watches) / sizeof(char*); i += 2) { + sprintf(part, "%s: %s", run_watches[i], (process_runs(run_watches[i+1]) ? "yes" : "no")); + push_part(part, strlen(part)); + } + char *wireless_info = get_wireless_info(); push_part(wireless_info, strlen(wireless_info)); @@ -250,9 +295,10 @@ int main(void) { char *battery_info = get_battery_info(); push_part(battery_info, strlen(battery_info)); - /* Get load */ int load_avg = open("/proc/loadavg", O_RDONLY); + if (load_avg == -1) + die("Could not open /proc/loadavg"); read(load_avg, part, sizeof(part)); close(load_avg); end = skip_character(part, ' ', 3); @@ -261,14 +307,10 @@ int main(void) { /* Get date & time */ time_t current_time = time(NULL); struct tm *current_tm = localtime(¤t_time); - strftime(part, sizeof(part), "%d.%m.%Y %H:%M:%S", current_tm); + strftime(part, sizeof(part), time_format, current_tm); push_part(part, strlen(part)); - printf("output = %s\n", output); - - int fd = open("/mnt/wmii/rbar/status", O_RDWR); - write(fd, output, strlen(output)); - close(fd); + write_to_statusbar(output); sleep(1); }