2009-07-21 18:26:53 +00:00
|
|
|
// vim:ts=8:expandtab
|
2009-07-21 17:07:30 +00:00
|
|
|
#include <stdbool.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <dirent.h>
|
|
|
|
|
|
|
|
#include "i3status.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Writes an errormessage to statusbar
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void write_error_to_statusbar(const char *message) {
|
|
|
|
cleanup_rbar_dir();
|
|
|
|
create_file("error");
|
|
|
|
write_to_statusbar("error", message, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Returns the correct color format for dzen (^fg(color)) or wmii (color <normcolors>)
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
char *color(const char *colorstr) {
|
|
|
|
static char colorbuf[32];
|
|
|
|
#ifdef DZEN
|
|
|
|
(void)snprintf(colorbuf, sizeof(colorbuf), "^fg(%s)", colorstr);
|
|
|
|
#else
|
|
|
|
(void)snprintf(colorbuf, sizeof(colorbuf), "%s %s ", colorstr, wmii_normcolors);
|
|
|
|
#endif
|
|
|
|
return colorbuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cleans wmii's /rbar directory by deleting all regular files
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void cleanup_rbar_dir() {
|
|
|
|
#ifdef DZEN
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
struct dirent *ent;
|
|
|
|
DIR *dir;
|
|
|
|
char pathbuf[strlen(wmii_path)+256+1];
|
|
|
|
|
|
|
|
if ((dir = opendir(wmii_path)) == NULL)
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
|
|
|
while ((ent = readdir(dir)) != NULL) {
|
|
|
|
if (ent->d_type == DT_REG) {
|
|
|
|
(void)snprintf(pathbuf, sizeof(pathbuf), "%s%s", wmii_path, ent->d_name);
|
|
|
|
if (unlink(pathbuf) == -1)
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
(void)closedir(dir);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Creates the specified file in wmii's /rbar directory with
|
|
|
|
* correct modes and initializes colors if colormode is enabled
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void create_file(const char *name) {
|
|
|
|
#ifdef DZEN
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
char pathbuf[strlen(wmii_path)+256+1];
|
|
|
|
int fd;
|
|
|
|
int flags = O_CREAT | O_WRONLY;
|
|
|
|
struct stat statbuf;
|
|
|
|
|
|
|
|
(void)snprintf(pathbuf, sizeof(pathbuf), "%s%s", wmii_path, name);
|
|
|
|
|
|
|
|
/* Overwrite file's contents if it exists */
|
|
|
|
if (stat(pathbuf, &statbuf) >= 0)
|
|
|
|
flags |= O_TRUNC;
|
|
|
|
|
|
|
|
if ((fd = open(pathbuf, flags, S_IRUSR | S_IWUSR)) < 0)
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
if (use_colors) {
|
|
|
|
char *tmp = color("#888888");
|
|
|
|
if (write(fd, tmp, strlen(tmp)) != (ssize_t)strlen(tmp))
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
(void)close(fd);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Waits until wmii_path/rbar exists (= the filesystem gets mounted),
|
|
|
|
* cleans up all files and creates the needed files
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void setup(void) {
|
|
|
|
unsigned int i;
|
|
|
|
char pathbuf[512];
|
|
|
|
|
|
|
|
#ifndef DZEN
|
|
|
|
struct stat statbuf;
|
|
|
|
/* Wait until wmii_path/rbar exists */
|
|
|
|
for (; stat(wmii_path, &statbuf) < 0; sleep(interval));
|
|
|
|
#endif
|
2009-07-21 18:23:08 +00:00
|
|
|
#define cf(orderidx, name) create_file(order_to_str(order[orderidx], name));
|
2009-07-21 17:07:30 +00:00
|
|
|
|
|
|
|
cleanup_rbar_dir();
|
|
|
|
if (wlan_interface)
|
2009-07-21 18:23:08 +00:00
|
|
|
cf(ORDER_WLAN, "wlan");
|
2009-07-21 17:07:30 +00:00
|
|
|
if (eth_interface)
|
2009-07-21 18:23:08 +00:00
|
|
|
cf(ORDER_ETH, "eth");
|
2009-07-21 17:07:30 +00:00
|
|
|
if (get_cpu_temperature)
|
2009-07-21 18:23:08 +00:00
|
|
|
cf(ORDER_CPU_TEMPERATURE, "cpu_temperature");
|
|
|
|
cf(ORDER_LOAD, "load");
|
2009-07-21 17:07:30 +00:00
|
|
|
if (time_format)
|
2009-07-21 18:23:08 +00:00
|
|
|
cf(ORDER_TIME, "time");
|
2009-07-21 17:07:30 +00:00
|
|
|
for (i = 0; i < num_run_watches; i += 2) {
|
2009-07-21 18:23:08 +00:00
|
|
|
snprintf(pathbuf, sizeof(pathbuf), "%d%s", order[ORDER_RUN], run_watches[i]);
|
2009-07-21 17:07:30 +00:00
|
|
|
create_file(pathbuf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Writes the given message in the corresponding file in wmii's /rbar directory
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void write_to_statusbar(const char *name, const char *message, bool final_entry) {
|
|
|
|
#ifdef DZEN
|
|
|
|
if (final_entry) {
|
|
|
|
if (printf("%s^p(6)\n", message) < 0) {
|
|
|
|
perror("printf");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
fflush(stdout);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (printf("%s" BAR, message) < 0) {
|
|
|
|
perror("printf");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
char pathbuf[strlen(wmii_path)+256+1];
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
(void)snprintf(pathbuf, sizeof(pathbuf), "%s%s", wmii_path, name);
|
|
|
|
if ((fd = open(pathbuf, O_RDWR)) == -1) {
|
|
|
|
/* Try to re-setup stuff and just continue */
|
|
|
|
setup();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (write(fd, message, strlen(message)) != (ssize_t)strlen(message))
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
(void)close(fd);
|
|
|
|
}
|