# include <config.h>
#endif
+#ifdef CRASH_DIALOG
+
+#include "defs.h"
+
#include <glib.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
# include <gnu/libc-version.h>
#endif
+#ifdef SIGTERM
+#include "main.h"
+#endif
+#include "sylpheed.h"
#include "intl.h"
#include "crash.h"
#include "utils.h"
#include "version.h"
#include "prefs_common.h"
-#if 0
-#include "gtkutils.h"
-#include "pixmaps/notice_error.xpm"
-#endif
-
/*
- * NOTE 1: the crash dialog is called when sylpheed is not
+ * NOTE: the crash dialog is called when sylpheed is not
* initialized, so do not assume settings are available.
* for example, loading / creating pixmaps seems not
* to be possible.
static GtkWidget *crash_dialog_show (const gchar *text,
const gchar *debug_output);
-static gboolean crash_create_debugger_file (void);
+static void crash_create_debugger_file (void);
static void crash_save_crash_log (GtkButton *, const gchar *);
static void crash_create_bug_report (GtkButton *, const gchar *);
static void crash_debug (unsigned long crash_pid,
/***/
-static const gchar *DEBUG_SCRIPT = "bt\nq";
+static const gchar *DEBUG_SCRIPT = "bt\nkill\nq";
/***/
*/
void crash_install_handlers(void)
{
-#if HAVE_GDB
+#if CRASH_DIALOG
sigset_t mask;
if (!is_crash_dialog_allowed()) return;
#endif
sigprocmask(SIG_UNBLOCK, &mask, 0);
-#endif /* HAVE_GDB */
+#endif /* CRASH_DIALOG */
}
/***/
*/
void crash_main(const char *arg)
{
-#if HAVE_GDB
+#if CRASH_DIALOG
gchar *text;
gchar **tokens;
unsigned long pid;
GString *output;
- extern gchar *startup_dir;
crash_create_debugger_file();
tokens = g_strsplit(arg, ",", 0);
g_string_free(output, TRUE);
g_free(text);
g_strfreev(tokens);
-#endif /* HAVE_GDB */
+#endif /* CRASH_DIALOG */
}
/*!
- *\brief (can't get pixmap working, so discarding it)
+ *\brief show crash dialog
+ *
+ *\param text Description
+ *\param debug_output Output text by gdb
+ *
+ *\return GtkWidget * Dialog widget
*/
static GtkWidget *crash_dialog_show(const gchar *text, const gchar *debug_output)
{
GtkWidget *button3;
GtkWidget *button4;
GtkWidget *button5;
- GtkWidget *pixwid;
- GdkPixmap *pix;
- GdkBitmap *msk;
gchar *crash_report;
window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, TRUE, 0);
gtk_container_set_border_width(GTK_CONTAINER(hbox1), 4);
-#if 0
- PIXMAP_CREATE(window1, pix, msk, notice_error_xpm);
- pixwid = gtk_pixmap_new(pix, msk);
- gtk_widget_show(pixwid);
- gtk_box_pack_start(GTK_BOX(hbox1), pixwid, TRUE, TRUE, 0);
-#endif
-
label1 = gtk_label_new
(g_strdup_printf(_("%s.\nPlease file a bug report and include the information below."), text));
gtk_widget_show(label1);
gtk_container_add(GTK_CONTAINER(frame1), scrolledwindow1);
gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow1), 3);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow1),
- GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
text1 = gtk_text_new(NULL, NULL);
- gtk_text_set_editable(GTK_TEXT(text1), FALSE);
+ gtk_text_set_editable((text1), FALSE);
gtk_widget_show(text1);
gtk_container_add(GTK_CONTAINER(scrolledwindow1), text1);
get_lib_version(),
debug_output);
- gtk_text_insert(GTK_TEXT(text1), NULL, NULL, NULL, crash_report, -1);
+ gtk_text_insert((text1), NULL, NULL, NULL, crash_report, -1);
hbuttonbox3 = gtk_hbutton_box_new();
gtk_widget_show(hbuttonbox3);
gtk_container_add(GTK_CONTAINER(hbuttonbox4), button5);
GTK_WIDGET_SET_FLAGS(button5, GTK_CAN_DEFAULT);
- gtk_signal_connect(GTK_OBJECT(window1), "delete_event",
- GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
- gtk_signal_connect(GTK_OBJECT(button3), "clicked",
- GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
- gtk_signal_connect(GTK_OBJECT(button4), "clicked",
- GTK_SIGNAL_FUNC(crash_save_crash_log),
- crash_report);
- gtk_signal_connect(GTK_OBJECT(button5), "clicked",
- GTK_SIGNAL_FUNC(crash_create_bug_report),
- NULL);
+ g_signal_connect(G_OBJECT(window1), "delete_event",
+ G_CALLBACK(gtk_main_quit), NULL);
+ g_signal_connect(G_OBJECT(button3), "clicked",
+ G_CALLBACK(gtk_main_quit), NULL);
+ g_signal_connect(G_OBJECT(button4), "clicked",
+ G_CALLBACK(crash_save_crash_log), crash_report);
+ g_signal_connect(G_OBJECT(button5), "clicked",
+ G_CALLBACK(crash_create_bug_report), NULL);
gtk_widget_show(window1);
* all the other options (creating temp files) looked too
* convoluted.
*/
-static gboolean crash_create_debugger_file(void)
+static void crash_create_debugger_file(void)
{
gchar *filespec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, DEBUGGERRC, NULL);
timer = time(NULL);
lt = localtime(&timer);
- strftime(buf, sizeof buf, "sylpheed-crash-log-%y-%m-%d-%H-%M-%S.txt", lt);
- if (NULL != (filename = filesel_select_file(_("Save crash information"), buf))
+ strftime(buf, sizeof buf, "sylpheed-crash-log-%Y-%m-%d-%H-%M-%S.txt", lt);
+ if (NULL != (filename = filesel_select_file_save(_("Save crash information"), buf))
&& *filename)
str_write_to_file(text, filename);
g_free(filename);
*/
static void crash_create_bug_report(GtkButton *button, const gchar *data)
{
- open_uri("http://sourceforge.net/tracker/?func=add&group_id=25528&atid=384598",
- prefs_common.uri_cmd);
+ open_uri(CLAWS_BUGZILLA_URI, prefs_common.uri_cmd);
}
/*!
*argptr++ = "-x";
*argptr++ = filespec;
*argptr++ = exe_image;
- *argptr++ = g_strdup_printf("%d", crash_pid);
+ *argptr++ = g_strdup_printf("%ld", crash_pid);
*argptr = NULL;
/*
#if HAVE_LIBJCONV
" libjconv"
#endif
-#if USE_GPGME
- " GPGME"
-#endif
-#if USE_SSL
- " SSL"
+#if USE_OPENSSL
+ " OpenSSL"
#endif
#if USE_LDAP
" LDAP"
#if USE_JPILOT
" JPilot"
#endif
-#if USE_PSPELL
- " pspell"
+#if USE_ASPELL
+ " GNU/aspell"
#endif
"");
}
static volatile unsigned long crashed_ = 0;
/*
- * let's hope startup_dir and argv0 aren't trashed.
+ * let's hope argv0 aren't trashed.
* both are defined in main.c.
*/
- extern gchar *startup_dir;
extern gchar *argv0;
crashed_++;
+#ifdef SIGTERM
+ if (sig == SIGTERM)
+ clean_quit(NULL);
+#endif
+
/*
* gnome ungrabs focus, and flushes gdk. mmmh, good idea.
*/
args[0] = argv0;
args[1] = "--debug";
args[2] = "--crash";
- sprintf(buf, "%ld,%d,%s", getppid(), sig, argv0);
+ sprintf(buf, "%d,%d,%s", getppid(), sig, argv0);
args[3] = buf;
args[4] = NULL;
- chdir(startup_dir);
+ chdir(sylpheed_get_startup_dir());
setgid(getgid());
setuid(getuid());
execvp(argv0, args);
unlink(filename);
}
+#endif