X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=wmiistatus.c;h=c26781abe0c6e536d7ab8770025d076d67888e67;hb=7fa8c4b9a954647db79f79b78b33d79c00acd250;hp=00aa487aab8390490a956d06dd36c54caef64443;hpb=e31a85eb3b9d331d73254ceb2d6156cc8e66c40a;p=i3%2Fi3status diff --git a/wmiistatus.c b/wmiistatus.c index 00aa487..c26781a 100644 --- a/wmiistatus.c +++ b/wmiistatus.c @@ -48,18 +48,55 @@ #include #include #include +#include #include "wmiistatus.h" #include "config.h" -static void write_to_statusbar(const char *message) { - int fd = open(wmii_path, O_RDWR); +static void cleanup_rbar_dir() { + struct dirent *ent; + DIR *dir; + char pathbuf[strlen(wmii_path)+256+1]; + + if ((dir = opendir(wmii_path)) == NULL) + exit(-3); + + while ((ent = readdir(dir)) != NULL) { + if (ent->d_type == DT_REG) { + sprintf(pathbuf, "%s%s", wmii_path, ent->d_name); + unlink(pathbuf); + } + } + + closedir(dir); +} + +static void create_file(const char *name) { + char pathbuf[strlen(wmii_path)+256+1]; + + sprintf(pathbuf, "%s%s", wmii_path, name); + int fd = creat(pathbuf, S_IRUSR | S_IWUSR); + if (fd < 0) + exit(-4); + close(fd); +} + +static void write_to_statusbar(const char *name, const char *message) { + char pathbuf[strlen(wmii_path)+256+1]; + + sprintf(pathbuf, "%s%s", wmii_path, name); + int fd = open(pathbuf, O_RDWR); if (fd == -1) exit(-2); write(fd, message, strlen(message)); close(fd); } +static void write_error_to_statusbar(const char *message) { + cleanup_rbar_dir(); + write_to_statusbar("error", message); +} + /* * Write errormessage to statusbar and exit * @@ -71,7 +108,7 @@ static void die(const char *fmt, ...) { vsprintf(buffer, fmt, ap); va_end(ap); - write_to_statusbar(buffer); + write_error_to_statusbar(buffer); exit(-1); } @@ -246,7 +283,9 @@ static char *get_eth_info() { */ static bool process_runs(const char *path) { char pidbuf[512], - procbuf[512]; + procbuf[512], + *walk; + int n; static glob_t globbuf; struct stat statbuf; @@ -257,8 +296,15 @@ static bool process_runs(const char *path) { globfree(&globbuf); if (fd < 0) return false; - read(fd, pidbuf, sizeof(pidbuf)); + 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); } @@ -268,6 +314,13 @@ int main(void) { *end; unsigned int i; + cleanup_rbar_dir(); + create_file(ORDER_WLAN "wlan"); + create_file(ORDER_ETH "eth"); + create_file(ORDER_BATTERY "battery"); + create_file(ORDER_LOAD "load"); + create_file(ORDER_TIME "time"); + while (1) { memset(output, '\0', sizeof(output)); first_push = true; @@ -278,13 +331,13 @@ int main(void) { } char *wireless_info = get_wireless_info(); - push_part(wireless_info, strlen(wireless_info)); + write_to_statusbar(ORDER_WLAN "wlan", wireless_info); char *eth_info = get_eth_info(); - push_part(eth_info, strlen(eth_info)); + write_to_statusbar(ORDER_ETH "eth", eth_info); char *battery_info = get_battery_info(); - push_part(battery_info, strlen(battery_info)); + write_to_statusbar(ORDER_BATTERY "battery", battery_info); /* Get load */ int load_avg = open("/proc/loadavg", O_RDONLY); @@ -293,15 +346,14 @@ int main(void) { read(load_avg, part, sizeof(part)); close(load_avg); end = skip_character(part, ' ', 3); - push_part(part, (end-part)); + *end = '\0'; + write_to_statusbar(ORDER_LOAD "load", part); /* Get date & time */ time_t current_time = time(NULL); struct tm *current_tm = localtime(¤t_time); strftime(part, sizeof(part), time_format, current_tm); - push_part(part, strlen(part)); - - write_to_statusbar(output); + write_to_statusbar(ORDER_TIME "time", part); sleep(1); }