X-Git-Url: http://git.maemo.org/git/?p=browser-switch;a=blobdiff_plain;f=main.c;h=093b535918953ff89e6831e4ee114c47bd89d0af;hp=46572b06e38e79216a832f02e3a106b1ace197b1;hb=81d2b2485ca2a490af7f4bb5d4e2995c35c12915;hpb=63bfe571ee86f00936e30853f4289df6efd2b52d diff --git a/main.c b/main.c index 46572b0..093b535 100644 --- a/main.c +++ b/main.c @@ -1,7 +1,7 @@ /* * main.c -- config file parsing and main loop for browser-switchboard * - * Copyright (C) 2009 Steven Luo + * Copyright (C) 2009-2010 Steven Luo * Derived from a Python implementation by Jason Simpson and Steven Luo * * This program is free software; you can redistribute it and/or @@ -22,18 +22,16 @@ #include #include -#include -#include #include #include #include -#include #include #include "browser-switchboard.h" #include "launcher.h" #include "dbus-server-bindings.h" #include "configfile.h" +#include "log.h" struct swb_context ctx; @@ -48,14 +46,14 @@ static void set_config_defaults(struct swb_context *ctx) { static void waitforzombies(int signalnum) { while (waitpid(-1, NULL, WNOHANG) > 0) - printf("Waited for a zombie\n"); + log_msg("Waited for a zombie\n"); } static void read_config(int signalnum) { FILE *fp; int continuous_mode_seen = 0; struct swb_config_line line; - char *default_browser = NULL; + char *default_browser = NULL, *logger_name = NULL; set_config_defaults(&ctx); @@ -80,6 +78,9 @@ static void read_config(int signalnum) { } else if (!strcmp(line.key, "other_browser_cmd")) { if (!ctx.other_browser_cmd) ctx.other_browser_cmd = line.value; + } else if (!strcmp(line.key, "logging")) { + if (!logger_name) + logger_name = line.value; } else { /* Don't need this line's contents */ free(line.value); @@ -89,14 +90,21 @@ static void read_config(int signalnum) { } parse_config_file_end(); - printf("continuous_mode: %d\n", ctx.continuous_mode); - printf("default_browser: '%s'\n", default_browser?default_browser:"NULL"); - printf("other_browser_cmd: '%s'\n", ctx.other_browser_cmd?ctx.other_browser_cmd:"NULL"); - out: fclose(fp); out_noopen: + log_config(logger_name); update_default_browser(&ctx, default_browser); + + log_msg("continuous_mode: %d\n", ctx.continuous_mode); + log_msg("default_browser: '%s'\n", + default_browser?default_browser:"NULL"); + log_msg("other_browser_cmd: '%s'\n", + ctx.other_browser_cmd?ctx.other_browser_cmd:"NULL"); + log_msg("logging: '%s'\n", + logger_name?logger_name:"NULL"); + + free(logger_name); free(default_browser); return; } @@ -105,6 +113,7 @@ int main() { OssoBrowser *obj_osso_browser, *obj_osso_browser_req; GMainLoop *mainloop; GError *error = NULL; + int reqname_result; read_config(0); @@ -117,14 +126,14 @@ int main() { /* SIGCHLD -- clean up after zombies */ act.sa_handler = waitforzombies; if (sigaction(SIGCHLD, &act, NULL) == -1) { - printf("Installing signal handler failed\n"); + log_msg("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"); + log_msg("Installing signal handler failed\n"); return 1; } } @@ -137,14 +146,35 @@ int main() { /* 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"); + log_msg("Couldn't get a D-Bus bus connection\n"); return 1; } ctx.dbus_proxy = dbus_g_proxy_new_for_name(ctx.session_bus, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus"); if (!ctx.dbus_proxy) { - printf("Couldn't get an org.freedesktop.DBus proxy\n"); + log_msg("Couldn't get an org.freedesktop.DBus proxy\n"); + return 1; + } + + /* Get the org.maemo.garage.browser-switchboard name from D-Bus, as + a form of locking to ensure that not more than one + browser-switchboard process is active at any time. With + DBUS_NAME_FLAG_DO_NOT_QUEUE set and DBUS_NAME_FLAG_REPLACE_EXISTING + not set, getting the name succeeds if and only if no other + process owns the name. */ + if (!dbus_g_proxy_call(ctx.dbus_proxy, "RequestName", &error, + G_TYPE_STRING, "org.maemo.garage.browser-switchboard", + G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE, + G_TYPE_INVALID, + G_TYPE_UINT, &reqname_result, + G_TYPE_INVALID)) { + log_msg("Couldn't acquire browser-switchboard lock: %s\n", + error->message); + return 1; + } + if (reqname_result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + log_msg("Another browser-switchboard already running\n"); return 1; } @@ -160,9 +190,9 @@ int main() { G_OBJECT(obj_osso_browser_req)); mainloop = g_main_loop_new(NULL, FALSE); - printf("Starting main loop\n"); + log_msg("Starting main loop\n"); g_main_loop_run(mainloop); - printf("Main loop completed\n"); + log_msg("Main loop completed\n"); return 0; }