2 * config.c -- configuration functions for Browser Switchboard
4 * Copyright (C) 2009-2010 Steven Luo
5 * Derived from a Python implementation by Jason Simpson and Steven Luo
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
27 #include "configfile.h"
30 /* The Browser Switchboard config file options */
31 struct swb_config_option swb_config_options[] = {
32 { "continuous_mode", SWB_CONFIG_OPT_INT, SWB_CONFIG_CONTINUOUS_MODE_SET, offsetof(struct swb_config, continuous_mode) },
33 { "default_browser", SWB_CONFIG_OPT_STRING, SWB_CONFIG_DEFAULT_BROWSER_SET, offsetof(struct swb_config, default_browser) },
34 { "other_browser_cmd", SWB_CONFIG_OPT_STRING, SWB_CONFIG_OTHER_BROWSER_CMD_SET, offsetof(struct swb_config, other_browser_cmd) },
35 { "logging", SWB_CONFIG_OPT_STRING, SWB_CONFIG_LOGGING_SET, offsetof(struct swb_config, logging) },
36 { "autostart_microb", SWB_CONFIG_OPT_INT, SWB_CONFIG_AUTOSTART_MICROB_SET, offsetof(struct swb_config, autostart_microb) },
40 /* Browser Switchboard configuration defaults */
41 static struct swb_config swb_config_defaults = {
42 .flags = SWB_CONFIG_INITIALIZED,
44 .default_browser = "microb",
45 .other_browser_cmd = NULL,
47 .autostart_microb = -1,
51 /* Initialize a swb_config struct with configuration defaults */
52 inline void swb_config_init(struct swb_config *cfg) {
53 *cfg = swb_config_defaults;
56 /* Free all heap memory used in an swb_config struct
57 This MUST NOT be done if any of the strings are being used elsewhere! */
58 void swb_config_free(struct swb_config *cfg) {
64 if (!(cfg->flags & SWB_CONFIG_INITIALIZED))
67 for (i = 0; swb_config_options[i].name; ++i) {
68 entry = (char *)cfg + swb_config_options[i].offset;
69 if (cfg->flags & swb_config_options[i].set_mask) {
70 switch (swb_config_options[i].type) {
71 case SWB_CONFIG_OPT_STRING:
72 free(*(char **)entry);
73 *(char **)entry = NULL;
84 /* Load a value into the part of a struct swb_config indicated by name */
85 static int swb_config_load_option(struct swb_config *cfg,
86 char *name, char *value) {
87 struct swb_config_option *opt;
90 /* Search through list of recognized config options for a match */
91 for (opt = swb_config_options; opt->name; ++opt) {
92 if (strcmp(name, opt->name))
95 if (!(cfg->flags & opt->set_mask)) {
96 entry = (char *)cfg + opt->offset;
98 case SWB_CONFIG_OPT_STRING:
99 *(char **)entry = value;
101 case SWB_CONFIG_OPT_INT:
102 *(int *)entry = atoi(value);
106 cfg->flags |= opt->set_mask;
108 /* Option was repeated in the config file
109 We want the first value, so ignore this one */
115 /* Unrecognized config option */
120 /* Read the config file and load settings into the provided swb_config struct
121 Caller is responsible for freeing allocated strings with free()
122 Returns true on success, false otherwise */
123 int swb_config_load(struct swb_config *cfg) {
125 struct swb_config_line line;
127 if (!cfg || !(cfg->flags & SWB_CONFIG_INITIALIZED))
130 if (!(fp = open_config_file()))
133 /* Parse the config file
134 TODO: should we handle errors differently than EOF? */
135 if (!parse_config_file_begin())
137 while (!parse_config_file_line(fp, &line)) {
139 swb_config_load_option(cfg, line.key, line.value);
142 parse_config_file_end();