summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@novell.com>2004-06-23 21:12:53 +0000
committerJeffrey Stedfast <fejj@src.gnome.org>2004-06-23 21:12:53 +0000
commit54b4ca68d3f4228fdbc0e1ae948c6ecc8a078480 (patch)
tree8542b3e05d9fdd7f486723f9a4428433d02e4268 /src
parentf24d1fa9550c1fe57205308b19e5e59302730b48 (diff)
downloadevolution-data-server-54b4ca68d3f4228fdbc0e1ae948c6ecc8a078480.tar.gz
Register a segv handler to popup bug-buddy or whatever. Fixes bug #51165.
2004-06-23 Jeffrey Stedfast <fejj@novell.com> * src/server.c (main): Register a segv handler to popup bug-buddy or whatever. Fixes bug #51165.
Diffstat (limited to 'src')
-rw-r--r--src/server.c45
1 files changed, 41 insertions, 4 deletions
diff --git a/src/server.c b/src/server.c
index c4489917f..77cb60552 100644
--- a/src/server.c
+++ b/src/server.c
@@ -29,9 +29,7 @@
/*#define DEBUG_BACKENDS*/
#include <stdlib.h>
-#ifdef DEBUG_BACKENDS
#include <sys/signal.h>
-#endif
#include <glib.h>
#include <libgnome/gnome-init.h>
@@ -85,7 +83,44 @@ static guint termination_handler_id;
static GStaticMutex termination_lock = G_STATIC_MUTEX_INIT;
-
+
+static void
+gnome_segv_handler (int signo)
+{
+ const char *gnome_segv_path;
+ static int in_segv = 0;
+ char *exec;
+
+ if (in_segv > 2) {
+ /* The fprintf() was segfaulting, we are just totally hosed */
+ _exit (1);
+ } else if (in_segv > 1) {
+ /* dialog display isn't working out */
+ fprintf (stderr, _("Multiple segmentation faults occurred; can't display error dialog\n"));
+ _exit (1);
+ }
+
+ if (!(gnome_segv_path = g_find_program_in_path ("gnome_segv2")))
+ gnome_segv_path = PREFIX "/libexec/gnome_segv2";
+
+ exec = g_strdup_printf ("%s \"" PACKAGE "\" %d \"" VERSION "\"", gnome_segv_path, signo);
+ system (exec);
+ g_free (exec);
+}
+
+static void
+setup_segv_handler (void)
+{
+ struct sigaction sa;
+
+ sa.sa_flags = 0;
+ sigemptyset (&sa.sa_mask);
+ sa.sa_handler = gnome_segv_handler;
+ sigaction (SIGSEGV, &sa, NULL);
+ sigaction (SIGBUS, &sa, NULL);
+ sigaction (SIGFPE, &sa, NULL);
+}
+
/* Termination */
@@ -281,7 +316,9 @@ main (int argc, char **argv)
bonobo_activation_orb_get(),
CORBA_OBJECT_NIL,
CORBA_OBJECT_NIL);
-
+
+ setup_segv_handler ();
+
if (!( (did_books = setup_books ())
&& (did_cals = setup_cals ())
)) {