From 7fa8c4b9a954647db79f79b78b33d79c00acd250 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 7 Oct 2008 11:45:52 +0200 Subject: [PATCH] Write information in separate files, define order wmii will show them with little border between, better than the previous method, where an ascii bar was shown --- config.h | 9 +++++++- wmiistatus.c | 63 +++++++++++++++++++++++++++++++++++++++++++--------- wmiistatus.h | 4 +++- 3 files changed, 64 insertions(+), 12 deletions(-) diff --git a/config.h b/config.h index baaa240..8b4f01e 100644 --- a/config.h +++ b/config.h @@ -1,7 +1,14 @@ const char *wlan_interface = "wlan0"; const char *eth_interface = "eth0"; -const char *wmii_path = "/mnt/wmii/rbar/status"; +/* wmii_path has to be terminated by slash */ +const char *wmii_path = "/mnt/wmii/rbar/"; const char *time_format = "%d.%m.%Y %H:%M:%S"; const char *battery = "/sys/class/power_supply/BAT0/uevent"; const char *run_watches[] = {"DHCP", "/var/run/dhclient.pid", "VPN", "/var/run/vpnc*.pid"}; + +#define ORDER_WLAN "0" +#define ORDER_ETH "1" +#define ORDER_BATTERY "2" +#define ORDER_LOAD "3" +#define ORDER_TIME "4" diff --git a/wmiistatus.c b/wmiistatus.c index bdb1e6a..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); } @@ -277,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; @@ -287,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); @@ -302,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); } diff --git a/wmiistatus.h b/wmiistatus.h index 1e7f59f..9836dff 100644 --- a/wmiistatus.h +++ b/wmiistatus.h @@ -5,7 +5,9 @@ static bool first_push = true; typedef enum { CS_DISCHARGING, CS_CHARGING, CS_FULL } charging_status_t; -static void write_to_statusbar(const char *message); +static void cleanup_rbar_dir(void); +static void write_to_statusbar(const char *name, const char *message); +static void write_error_to_statusbar(const char *message); static void die(const char *fmt, ...); static char *skip_character(char *input, char character, int amount); static void push_part(const char *input, const int n); -- 2.39.2