]> git.sur5r.net Git - i3/i3status/blob - src/config.c
Use own files for each function, add get_ipv6_addr.c
[i3/i3status] / src / config.c
1 #include <sys/stat.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <ctype.h>
6
7 #include "i3status.h"
8
9 /*
10  * Reads the configuration from the given file
11  *
12  */
13 int load_configuration(const char *configfile) {
14         #define OPT(x) else if (strcasecmp(dest_name, x) == 0)
15
16         /* check if the file exists */
17         struct stat buf;
18         if (stat(configfile, &buf) < 0)
19                 return -1;
20
21         int result = 0;
22         FILE *handle = fopen(configfile, "r");
23         if (handle == NULL)
24                 die("Could not open configfile\n");
25         char dest_name[512], dest_value[512], whole_buffer[1026];
26
27         while (!feof(handle)) {
28                 char *ret;
29                 if ((ret = fgets(whole_buffer, 1024, handle)) == whole_buffer) {
30                         /* sscanf implicitly strips whitespace */
31                         if (sscanf(whole_buffer, "%s %[^\n]", dest_name, dest_value) < 1)
32                                 continue;
33                 } else if (ret != NULL)
34                         die("Could not read line in configuration file\n");
35
36                 /* skip comments and empty lines */
37                 if (dest_name[0] == '#' || strlen(dest_name) < 3)
38                         continue;
39
40                 OPT("wlan")
41                         wlan_interface = strdup(dest_value);
42                 OPT("eth")
43                         eth_interface = strdup(dest_value);
44                 OPT("time_format")
45                         time_format = strdup(dest_value);
46                 OPT("battery") {
47                         struct battery *new = calloc(1, sizeof(struct battery));
48                         if (new == NULL)
49                                 die("Could not allocate memory\n");
50                         if (asprintf(&(new->path), "/sys/class/power_supply/BAT%d/uevent", atoi(dest_value)) == -1)
51                                 die("Could not build battery path\n");
52
53                         /* check if flags were specified for this battery */
54                         if (strstr(dest_value, ",") != NULL) {
55                                 char *flags = strstr(dest_value, ",");
56                                 flags++;
57                                 if (*flags == 'f')
58                                         new->use_last_full = true;
59                         }
60                         SIMPLEQ_INSERT_TAIL(&batteries, new, batteries);
61                 } OPT("color")
62                         use_colors = true;
63                 OPT("get_ethspeed")
64                         get_ethspeed = true;
65                 OPT("get_cpu_temperature") {
66                         get_cpu_temperature = true;
67                         if (strlen(dest_value) > 0) {
68                                 if (asprintf(&thermal_zone, "/sys/class/thermal/thermal_zone%d/temp", atoi(dest_value)) == -1)
69                                         die("Could not build thermal_zone path\n");
70                         } else {
71                                  if (asprintf(&thermal_zone, "/sys/class/thermal/thermal_zone0/temp") == -1)
72                                         die("Could not build thermal_zone path\n");
73                         }
74                 } OPT("normcolors")
75                         wmii_normcolors = strdup(dest_value);
76                 OPT("interval")
77                         interval = atoi(dest_value);
78                 OPT("wmii_path")
79                 {
80 #ifndef DZEN
81                         static glob_t globbuf;
82                         struct stat stbuf;
83                         if (glob(dest_value, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0)
84                                 die("glob() failed\n");
85                         wmii_path = strdup(globbuf.gl_pathc > 0 ? globbuf.gl_pathv[0] : dest_value);
86                         globfree(&globbuf);
87
88                         if ((stat(wmii_path, &stbuf)) == -1) {
89                                 fprintf(stderr, "Warning: wmii_path contains an invalid path\n");
90                                 free(wmii_path);
91                                 wmii_path = strdup(dest_value);
92                         }
93                         if (wmii_path[strlen(wmii_path)-1] != '/')
94                                 die("wmii_path is not terminated by /\n");
95 #endif
96                 }
97                 OPT("run_watch")
98                 {
99                         char *name = strdup(dest_value);
100                         char *path = name;
101                         while (*path != ' ')
102                                 path++;
103                         *(path++) = '\0';
104                         num_run_watches += 2;
105                         run_watches = realloc(run_watches, sizeof(char*) * num_run_watches);
106                         run_watches[num_run_watches-2] = name;
107                         run_watches[num_run_watches-1] = path;
108                 }
109                 OPT("order")
110                 {
111                         #define SET_ORDER(opt, idx) { if (strcasecmp(token, opt) == 0) sprintf(order[idx], "%d", c++); }
112                         char *walk, *token;
113                         int c = 0;
114                         walk = token = dest_value;
115                         while (*walk != '\0') {
116                                 while ((*walk != ',') && (*walk != '\0'))
117                                         walk++;
118                                 *(walk++) = '\0';
119                                 SET_ORDER("run", ORDER_RUN);
120                                 SET_ORDER("wlan", ORDER_WLAN);
121                                 SET_ORDER("eth", ORDER_ETH);
122                                 SET_ORDER("battery", ORDER_BATTERY);
123                                 SET_ORDER("cpu_temperature", ORDER_CPU_TEMPERATURE);
124                                 SET_ORDER("load", ORDER_LOAD);
125                                 SET_ORDER("time", ORDER_TIME);
126                                 token = walk;
127                                 while (isspace((int)(*token)))
128                                         token++;
129                         }
130                 }
131                 else
132                 {
133                         result = -2;
134                         die("Unknown configfile option: %s\n", dest_name);
135                 }
136         }
137         fclose(handle);
138
139 #ifndef DZEN
140         if (wmii_path == NULL)
141                 exit(EXIT_FAILURE);
142 #endif
143
144         return result;
145 }