diff options
| author | Jeffrey Stedfast <fejj@novell.com> | 2004-06-23 21:12:53 +0000 |
|---|---|---|
| committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2004-06-23 21:12:53 +0000 |
| commit | 54b4ca68d3f4228fdbc0e1ae948c6ecc8a078480 (patch) | |
| tree | 8542b3e05d9fdd7f486723f9a4428433d02e4268 /src | |
| parent | f24d1fa9550c1fe57205308b19e5e59302730b48 (diff) | |
| download | evolution-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.c | 45 |
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 ()) )) { |
