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.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <dbus/dbus-glib.h>
#include "browser-switchboard.h"
#include <dbus/dbus-glib.h>
#include "browser-switchboard.h"
#include "dbus-server-glue.h"
#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;
static void open_address(const char *uri) {
char *new_uri;
size_t new_uri_len;
*/
gboolean osso_browser_load_url(OssoBrowser *obj,
const char *uri, GError **error) {
*/
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) {
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) {
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) {
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;
}
launch_microb(&ctx, "new_window");
return TRUE;
}
for use by /usr/bin/browser wrapper to implement --url */
gboolean osso_browser_switchboard_launch_microb(OssoBrowser *obj,
const char *uri, GError **error) {
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;
}
launch_microb(&ctx, (char *)uri);
return TRUE;
}