X-Git-Url: http://git.maemo.org/git/?p=browser-switch;a=blobdiff_plain;f=main.c;h=84b78e01b4892762084c0371e70cc8560f3a2170;hp=ec1a04213a57187d0621576cce4a4e77dd8bbedb;hb=9f08a817761251fa1c0070e3c03558ddfda5a162;hpb=7d3b3e8a206bffae1e491f5887ab1aaaf69e4759 diff --git a/main.c b/main.c index ec1a042..84b78e0 100644 --- a/main.c +++ b/main.c @@ -27,19 +27,17 @@ #include #include #include +#include #include #include "browser-switchboard.h" #include "launcher.h" #include "dbus-server-bindings.h" - -#define DEFAULT_HOMEDIR "/home/user" -#define CONFIGFILE_LOC "/.config/browser-switchboard" -#define MAXLINE 1024 +#include "configfile.h" struct swb_context ctx; -static void set_config_defaults(struct swb_context * ctx) { +static void set_config_defaults(struct swb_context *ctx) { if (!ctx) return; free(ctx->other_browser_cmd); @@ -54,58 +52,72 @@ static void waitforzombies(int signalnum) { } static void read_config(int signalnum) { - char * homedir; - char * configfile; - size_t len; + FILE *fp; + regex_t re_ignore, re_config1, re_config2; + regmatch_t substrs[3]; char buf[MAXLINE]; - char * tmp; - char * value; - char * default_browser = NULL; - FILE * fp; + char *key, *value; + char *default_browser = NULL; + size_t len; set_config_defaults(&ctx); - if (!(homedir = getenv("HOME"))) - homedir = DEFAULT_HOMEDIR; - len = strlen(homedir) + strlen(CONFIGFILE_LOC) + 1; - if (!(configfile = calloc(len, sizeof(char)))) + if (!(fp = open_config_file())) goto out_noopen; - strncpy(configfile, homedir, strlen(homedir)); - strncat(configfile, CONFIGFILE_LOC, strlen(CONFIGFILE_LOC)); - if (!(fp = fopen(configfile, "r"))) - goto out_noopen; + /* compile regex matching blank lines or comments */ + if (regcomp(&re_ignore, REGEX_IGNORE, REGEX_IGNORE_FLAGS)) + goto out_nore; + /* compile regex matching foo = "bar", with arbitrary whitespace at + beginning and end of line and surrounding the = */ + if (regcomp(&re_config1, REGEX_CONFIG1, REGEX_CONFIG1_FLAGS)) { + regfree(&re_ignore); + goto out_nore; + } + /* compile regex matching foo = bar, with arbitrary whitespace at + beginning of line and surrounding the = */ + if (regcomp(&re_config2, REGEX_CONFIG2, REGEX_CONFIG2_FLAGS)) { + regfree(&re_ignore); + regfree(&re_config1); + goto out_nore; + } /* Read in the config file one line at a time and parse it XXX doesn't deal with lines longer than MAXLINE */ while (fgets(buf, MAXLINE, fp)) { - /* skip comments */ - if (buf[0] == '#') + /* skip blank lines and comments */ + if (!regexec(&re_ignore, buf, 0, NULL, 0)) + continue; + + /* Find the substrings corresponding to the key and value + If the line doesn't match our idea of a config file entry, + skip it */ + if (regexec(&re_config1, buf, 3, substrs, 0) && + regexec(&re_config2, buf, 3, substrs, 0)) continue; - /* look for the = in the line */ - if (!(tmp = strchr(buf, '='))) + if (substrs[1].rm_so == -1 || substrs[2].rm_so == -1) continue; - /* split the line into parameter (before =, in buf) and - value (after =, in value) */ - if (!(value = calloc(strlen(tmp+1)+1, sizeof(char)))) + /* copy the config value into a new string */ + len = substrs[2].rm_eo - substrs[2].rm_so; + if (!(value = calloc(len+1, sizeof(char)))) goto out; - strncpy(value, tmp+1, strlen(tmp+1)); - value[strlen(tmp+1)] = '\0'; - /* scribble over the = in buf with a \0 -- that makes buf - just the parameter name */ - *tmp = '\0'; - /* if we find a newline in value, replace that with a \0 too */ - if ((tmp = strchr(value, '\n'))) - *tmp = '\0'; - - if (!strcmp(buf, "continuous_mode")) { + strncpy(value, buf+substrs[2].rm_so, len); + /* calloc() zeroes the memory, so string is automatically + null terminated */ + + /* make key point to a null-terminated string holding the + config key */ + key = buf + substrs[1].rm_so; + buf[substrs[1].rm_eo] = '\0'; + + if (!strcmp(key, "continuous_mode")) { ctx.continuous_mode = atoi(value); free(value); - } else if (!strcmp(buf, "default_browser")) { + } else if (!strcmp(key, "default_browser")) { if (!default_browser) default_browser = value; - } else if (!strcmp(buf, "other_browser_cmd")) { + } else if (!strcmp(key, "other_browser_cmd")) { if (!ctx.other_browser_cmd) ctx.other_browser_cmd = value; } else { @@ -120,31 +132,38 @@ static void read_config(int signalnum) { printf("other_browser_cmd: '%s'\n", ctx.other_browser_cmd?ctx.other_browser_cmd:"NULL"); out: + regfree(&re_ignore); + regfree(&re_config1); + regfree(&re_config2); +out_nore: fclose(fp); out_noopen: update_default_browser(&ctx, default_browser); - free(configfile); free(default_browser); return; } int main() { - OssoBrowser * obj; - GMainLoop * mainloop; - GError * error = NULL; + OssoBrowser *obj_osso_browser, *obj_osso_browser_req; + GMainLoop *mainloop; + GError *error = NULL; read_config(0); if (ctx.continuous_mode) { + /* Install signal handlers */ struct sigaction act; act.sa_flags = SA_RESTART; + sigemptyset(&(act.sa_mask)); + /* SIGCHLD -- clean up after zombies */ act.sa_handler = waitforzombies; if (sigaction(SIGCHLD, &act, NULL) == -1) { printf("Installing signal handler failed\n"); return 1; } + /* SIGHUP -- reread config file */ act.sa_handler = read_config; if (sigaction(SIGHUP, &act, NULL) == -1) { printf("Installing signal handler failed\n"); @@ -157,6 +176,7 @@ int main() { dbus_g_object_type_install_info(OSSO_BROWSER_TYPE, &dbus_glib_osso_browser_object_info); + /* Get a connection to the D-Bus session bus */ ctx.session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); if (!ctx.session_bus) { printf("Couldn't get a D-Bus bus connection\n"); @@ -172,11 +192,14 @@ int main() { dbus_request_osso_browser_name(&ctx); - obj = g_object_new(OSSO_BROWSER_TYPE, NULL); + /* Register ourselves to handle the osso_browser D-Bus methods */ + obj_osso_browser = g_object_new(OSSO_BROWSER_TYPE, NULL); + obj_osso_browser_req = g_object_new(OSSO_BROWSER_TYPE, NULL); dbus_g_connection_register_g_object(ctx.session_bus, - "/com/nokia/osso_browser", G_OBJECT(obj)); + "/com/nokia/osso_browser", G_OBJECT(obj_osso_browser)); dbus_g_connection_register_g_object(ctx.session_bus, - "/com/nokia/osso_browser/request", G_OBJECT(obj)); + "/com/nokia/osso_browser/request", + G_OBJECT(obj_osso_browser_req)); mainloop = g_main_loop_new(NULL, FALSE); printf("Starting main loop\n");