From d9eaacdb0796bfa089b4dea6fb5f1ad1d9835c44 Mon Sep 17 00:00:00 2001 From: Steven Luo Date: Mon, 4 Jan 2010 18:38:44 -0800 Subject: [PATCH] Ensure reconfig signal doesn't interrupt request dispatch when (!continuous_mode) If SIGHUP is sent to a browser-switchboard process with continuous mode off, the process will quit. This is the right thing to do in most cases (the next request will relaunch the process, at which point it'll read the new config), but if we're in the middle of dispatching a request when the signal arrives, quitting immediately will cause the request to be lost. Since browser-switchboard quits upon completion of a request when continuous mode is off anyway, fix this by just ignoring SIGHUP while handling requests when continuous mode is off. --- dbus-server-bindings.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/dbus-server-bindings.c b/dbus-server-bindings.c index 939056b..4afaec8 100644 --- a/dbus-server-bindings.c +++ b/dbus-server-bindings.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "browser-switchboard.h" @@ -43,6 +44,21 @@ static void osso_browser_class_init(OssoBrowserClass *klass) #include "dbus-server-glue.h" +/* Ignore reconfiguration signal (SIGHUP) + When not running in continuous mode, no SIGHUP handler is installed, which + causes browser-switchboard to quit on a reconfig request. This is normally + what we want -- but if we're already in the process of dispatching a + request, we'll quit anyway after finishing what we're doing, so ignoring the + signal is the right thing to do. */ +static void ignore_reconfig_requests(void) { + struct sigaction act; + + act.sa_flags = SA_RESTART; + sigemptyset(&(act.sa_mask)); + act.sa_handler = SIG_IGN; + sigaction(SIGHUP, &act, NULL); +} + static void open_address(const char *uri) { char *new_uri; size_t new_uri_len; @@ -75,24 +91,32 @@ static void open_address(const char *uri) { */ gboolean osso_browser_load_url(OssoBrowser *obj, const char *uri, GError **error) { + if (!ctx.continuous_mode) + ignore_reconfig_requests(); open_address(uri); return TRUE; } gboolean osso_browser_mime_open(OssoBrowser *obj, const char *uri, GError **error) { + if (!ctx.continuous_mode) + ignore_reconfig_requests(); open_address(uri); return TRUE; } gboolean osso_browser_open_new_window(OssoBrowser *obj, const char *uri, GError **error) { + if (!ctx.continuous_mode) + ignore_reconfig_requests(); open_address(uri); return TRUE; } gboolean osso_browser_top_application(OssoBrowser *obj, GError **error) { + if (!ctx.continuous_mode) + ignore_reconfig_requests(); launch_microb(&ctx, "new_window"); return TRUE; } @@ -101,6 +125,8 @@ gboolean osso_browser_top_application(OssoBrowser *obj, for use by /usr/bin/browser wrapper to implement --url */ gboolean osso_browser_switchboard_launch_microb(OssoBrowser *obj, const char *uri, GError **error) { + if (!ctx.continuous_mode) + ignore_reconfig_requests(); launch_microb(&ctx, (char *)uri); return TRUE; } -- 1.7.9.5