From 54b4ca68d3f4228fdbc0e1ae948c6ecc8a078480 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 23 Jun 2004 21:12:53 +0000 Subject: Register a segv handler to popup bug-buddy or whatever. Fixes bug #51165. 2004-06-23 Jeffrey Stedfast * src/server.c (main): Register a segv handler to popup bug-buddy or whatever. Fixes bug #51165. --- src/server.c | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'src') 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 -#ifdef DEBUG_BACKENDS #include -#endif #include #include @@ -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 ()) )) { -- cgit v1.2.1