X-Git-Url: http://git.maemo.org/git/?p=browser-switch;a=blobdiff_plain;f=main.c;h=66591c676fc84141d8a46596c5a0e6d613bb359e;hp=ec1a04213a57187d0621576cce4a4e77dd8bbedb;hb=440aa502fa0b307aaba049e1b0f49a40f7345b63;hpb=7d3b3e8a206bffae1e491f5887ab1aaaf69e4759 diff --git a/main.c b/main.c index ec1a042..66591c6 100644 --- a/main.c +++ b/main.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "browser-switchboard.h" @@ -35,11 +36,12 @@ #define DEFAULT_HOMEDIR "/home/user" #define CONFIGFILE_LOC "/.config/browser-switchboard" +#define CONFIGFILE_LOC_OLD "/.config/browser-proxy" #define MAXLINE 1024 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,14 +56,14 @@ static void waitforzombies(int signalnum) { } static void read_config(int signalnum) { - char * homedir; - char * configfile; + char *homedir, *configfile; size_t len; char buf[MAXLINE]; - char * tmp; - char * value; - char * default_browser = NULL; - FILE * fp; + char *key, *value; + char *default_browser = NULL; + FILE *fp; + regex_t re_ignore, re_config1, re_config2; + regmatch_t substrs[3]; set_config_defaults(&ctx); @@ -70,42 +72,74 @@ static void read_config(int signalnum) { len = strlen(homedir) + strlen(CONFIGFILE_LOC) + 1; if (!(configfile = calloc(len, sizeof(char)))) goto out_noopen; - strncpy(configfile, homedir, strlen(homedir)); - strncat(configfile, CONFIGFILE_LOC, strlen(CONFIGFILE_LOC)); + snprintf(configfile, len, "%s%s", homedir, CONFIGFILE_LOC); + + if (!(fp = fopen(configfile, "r"))) { + /* Try the legacy config file location before giving up + XXX we assume here that CONFIGFILE_LOC_OLD is shorter + than CONFIGFILE_LOC! */ + snprintf(configfile, len, "%s%s", homedir, CONFIGFILE_LOC_OLD); + if (!(fp = fopen(configfile, "r"))) + goto out_noopen; + } - if (!(fp = fopen(configfile, "r"))) - goto out_noopen; + /* compile regex matching blank lines or comments */ + if (regcomp(&re_ignore, "^[[:space:]]*(#|$)", REG_EXTENDED|REG_NOSUB)) + goto out_nore; + /* compile regex matching foo = "bar", with arbitrary whitespace at + beginning and end of line and surrounding the = */ + if (regcomp(&re_config1, + "^[[:space:]]*([^=[:space:]]+)[[:space:]]*=[[:space:]]*\"(.*)\"[[:space:]]*$", + REG_EXTENDED)) { + 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, + "^[[:space:]]*([^=[:space:]]+)[[:space:]]*=[[:space:]]*(.*)$", + REG_EXTENDED|REG_NEWLINE)) { + 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; - /* look for the = in the line */ - if (!(tmp = strchr(buf, '='))) + + /* 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; + 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,6 +154,10 @@ 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); @@ -129,15 +167,16 @@ out_noopen: } 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) { struct sigaction act; act.sa_flags = SA_RESTART; + sigemptyset(&(act.sa_mask)); act.sa_handler = waitforzombies; if (sigaction(SIGCHLD, &act, NULL) == -1) { @@ -172,11 +211,13 @@ int main() { dbus_request_osso_browser_name(&ctx); - obj = g_object_new(OSSO_BROWSER_TYPE, NULL); + 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");