summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stapelberg <michael+x200@stapelberg.de>2008-10-07 11:45:52 +0200
committerMichael Stapelberg <michael+x200@stapelberg.de>2008-10-07 11:45:52 +0200
commit7fa8c4b9a954647db79f79b78b33d79c00acd250 (patch)
treecdd25efa79a1c098ea2daf963ba2d2b4c951703d
parente94e25208936ab8f6ab684b1b229bc29073b955d (diff)
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
-rw-r--r--config.h9
-rw-r--r--wmiistatus.c63
-rw-r--r--wmiistatus.h4
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 <netinet/in.h>
#include <arpa/inet.h>
#include <glob.h>
+#include <dirent.h>
#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(&current_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);