diff options
Diffstat (limited to 'src/config.c')
-rw-r--r-- | src/config.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/config.c b/src/config.c new file mode 100644 index 0000000..5904512 --- /dev/null +++ b/src/config.c @@ -0,0 +1,145 @@ +#include <sys/stat.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> + +#include "i3status.h" + +/* + * Reads the configuration from the given file + * + */ +int load_configuration(const char *configfile) { + #define OPT(x) else if (strcasecmp(dest_name, x) == 0) + + /* check if the file exists */ + struct stat buf; + if (stat(configfile, &buf) < 0) + return -1; + + int result = 0; + FILE *handle = fopen(configfile, "r"); + if (handle == NULL) + die("Could not open configfile\n"); + char dest_name[512], dest_value[512], whole_buffer[1026]; + + while (!feof(handle)) { + char *ret; + if ((ret = fgets(whole_buffer, 1024, handle)) == whole_buffer) { + /* sscanf implicitly strips whitespace */ + if (sscanf(whole_buffer, "%s %[^\n]", dest_name, dest_value) < 1) + continue; + } else if (ret != NULL) + die("Could not read line in configuration file\n"); + + /* skip comments and empty lines */ + if (dest_name[0] == '#' || strlen(dest_name) < 3) + continue; + + OPT("wlan") + wlan_interface = strdup(dest_value); + OPT("eth") + eth_interface = strdup(dest_value); + OPT("time_format") + time_format = strdup(dest_value); + OPT("battery") { + struct battery *new = calloc(1, sizeof(struct battery)); + if (new == NULL) + die("Could not allocate memory\n"); + if (asprintf(&(new->path), "/sys/class/power_supply/BAT%d/uevent", atoi(dest_value)) == -1) + die("Could not build battery path\n"); + + /* check if flags were specified for this battery */ + if (strstr(dest_value, ",") != NULL) { + char *flags = strstr(dest_value, ","); + flags++; + if (*flags == 'f') + new->use_last_full = true; + } + SIMPLEQ_INSERT_TAIL(&batteries, new, batteries); + } OPT("color") + use_colors = true; + OPT("get_ethspeed") + get_ethspeed = true; + OPT("get_cpu_temperature") { + get_cpu_temperature = true; + if (strlen(dest_value) > 0) { + if (asprintf(&thermal_zone, "/sys/class/thermal/thermal_zone%d/temp", atoi(dest_value)) == -1) + die("Could not build thermal_zone path\n"); + } else { + if (asprintf(&thermal_zone, "/sys/class/thermal/thermal_zone0/temp") == -1) + die("Could not build thermal_zone path\n"); + } + } OPT("normcolors") + wmii_normcolors = strdup(dest_value); + OPT("interval") + interval = atoi(dest_value); + OPT("wmii_path") + { +#ifndef DZEN + static glob_t globbuf; + struct stat stbuf; + if (glob(dest_value, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0) + die("glob() failed\n"); + wmii_path = strdup(globbuf.gl_pathc > 0 ? globbuf.gl_pathv[0] : dest_value); + globfree(&globbuf); + + if ((stat(wmii_path, &stbuf)) == -1) { + fprintf(stderr, "Warning: wmii_path contains an invalid path\n"); + free(wmii_path); + wmii_path = strdup(dest_value); + } + if (wmii_path[strlen(wmii_path)-1] != '/') + die("wmii_path is not terminated by /\n"); +#endif + } + OPT("run_watch") + { + char *name = strdup(dest_value); + char *path = name; + while (*path != ' ') + path++; + *(path++) = '\0'; + num_run_watches += 2; + run_watches = realloc(run_watches, sizeof(char*) * num_run_watches); + run_watches[num_run_watches-2] = name; + run_watches[num_run_watches-1] = path; + } + OPT("order") + { + #define SET_ORDER(opt, idx) { if (strcasecmp(token, opt) == 0) sprintf(order[idx], "%d", c++); } + char *walk, *token; + int c = 0; + walk = token = dest_value; + while (*walk != '\0') { + while ((*walk != ',') && (*walk != '\0')) + walk++; + *(walk++) = '\0'; + SET_ORDER("run", ORDER_RUN); + SET_ORDER("wlan", ORDER_WLAN); + SET_ORDER("eth", ORDER_ETH); + SET_ORDER("battery", ORDER_BATTERY); + SET_ORDER("cpu_temperature", ORDER_CPU_TEMPERATURE); + SET_ORDER("load", ORDER_LOAD); + SET_ORDER("time", ORDER_TIME); + token = walk; + while (isspace((int)(*token))) + token++; + } + } + else + { + result = -2; + die("Unknown configfile option: %s\n", dest_name); + } + } + fclose(handle); + +#ifndef DZEN + if (wmii_path == NULL) + exit(EXIT_FAILURE); +#endif + + return result; +} |