diff options
Diffstat (limited to 'hardinfo2')
-rw-r--r-- | hardinfo2/crash.c | 446 | ||||
-rw-r--r-- | hardinfo2/crash.h | 29 | ||||
-rw-r--r-- | hardinfo2/hardinfo.c | 2 | ||||
-rw-r--r-- | hardinfo2/util.c | 24 |
4 files changed, 0 insertions, 501 deletions
diff --git a/hardinfo2/crash.c b/hardinfo2/crash.c deleted file mode 100644 index 1c0b7a39..00000000 --- a/hardinfo2/crash.c +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (c) 2002-2008 Leandro Pereira <leandro@hardinfo.org> - * Copyright (c) 2002 the Sylpheed Claws Team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <glib.h> -#include <gtk/gtk.h> -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> -#include <time.h> -#include <sys/wait.h> - -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> - -#include <sys/utsname.h> - -#include <gnu/libc-version.h> - -#include "crash.h" -#include "hardinfo.h" -#include "config.h" -#include "iconcache.h" - -#if !GLIB_CHECK_VERSION(2,8,0) -#undef CRASH_DIALOG -#endif - -/***/ - -static GtkWidget * -crash_dialog_show(const gchar * text, - const gchar * debug_output); -static gboolean crash_create_debugger_file(void); -static void -crash_debug(unsigned long crash_pid, - gchar * exe_image, GString * debug_output); -static const gchar *get_compiled_in_features(void); -static const gchar *get_lib_version(void); -static const gchar *get_operating_system(void); -static gboolean is_crash_dialog_allowed(void); -static void crash_handler(int sig); -static void crash_cleanup_exit(void); - -/***/ - -static const gchar *DEBUG_SCRIPT = "bt full\n" "kill\n" "quit\n"; - -/***/ - -/* - * ! \brief install crash handlers - */ -void -crash_install_handlers(void) -{ -#if CRASH_DIALOG - sigset_t mask; - - if (!is_crash_dialog_allowed()) - return; - - sigemptyset(&mask); - -#ifdef SIGSEGV - signal(SIGSEGV, crash_handler); - sigaddset(&mask, SIGSEGV); -#endif - -#ifdef SIGFPE - signal(SIGFPE, crash_handler); - sigaddset(&mask, SIGFPE); -#endif - -#ifdef SIGILL - signal(SIGILL, crash_handler); - sigaddset(&mask, SIGILL); -#endif - -#ifdef SIGABRT - signal(SIGABRT, crash_handler); - sigaddset(&mask, SIGABRT); -#endif - - sigprocmask(SIG_UNBLOCK, &mask, 0); - -#endif /* CRASH_DIALOG */ -} - -/***/ - -/* - * ! \brief crash dialog entry point - */ -void -crash_main(const char *arg) -{ -#if CRASH_DIALOG - gchar *text; - gchar **tokens; - unsigned long pid; - GString *output; - - crash_create_debugger_file(); - tokens = g_strsplit(arg, ",", 0); - - pid = atol(tokens[0]); - text = g_strdup_printf("HardInfo process (%ld) died due to an error (%s)", - pid, g_strsignal(atol(tokens[1]))); - - output = g_string_new(""); - - crash_debug(pid, tokens[2], output); - crash_dialog_show(text, output->str); - - g_string_free(output, TRUE); - g_free(text); - g_strfreev(tokens); -#endif /* CRASH_DIALOG */ -} - -/* - * ! \brief (can't get pixmap working, so discarding it) - */ -static GtkWidget * -crash_dialog_show(const gchar * text, - const gchar * debug_output) -{ - GtkWidget *window1; - GtkWidget *vbox1; - GtkWidget *hbox1; - GtkWidget *label1; - GtkWidget *frame1; - GtkWidget *scrolledwindow1; - GtkWidget *text1; - GtkWidget *hbuttonbox3; - GtkWidget *hbuttonbox4; - GtkWidget *button3; - GtkWidget *pixwid; - GtkTextBuffer *buffer; - GtkTextIter iter; - gchar *crash_report, *header; - - window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_container_set_border_width(GTK_CONTAINER(window1), 5); - gtk_window_set_title(GTK_WINDOW(window1), "HardInfo has crashed"); - gtk_window_set_position(GTK_WINDOW(window1), GTK_WIN_POS_CENTER); - gtk_window_set_modal(GTK_WINDOW(window1), TRUE); - gtk_window_set_default_size(GTK_WINDOW(window1), 460, 350); - - vbox1 = gtk_vbox_new(FALSE, 2); - gtk_widget_show(vbox1); - gtk_container_add(GTK_CONTAINER(window1), vbox1); - - hbox1 = gtk_hbox_new(FALSE, 4); - gtk_widget_show(hbox1); - gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(hbox1), 4); - - pixwid = gtk_image_new_from_stock(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); - gtk_widget_show(pixwid); - gtk_box_pack_start(GTK_BOX(hbox1), pixwid, TRUE, TRUE, 0); - - header = g_strdup_printf("%s.\nPlease file a bug report and include the information below.", text); - label1 = gtk_label_new(header); - g_free(header); - - gtk_widget_show(label1); - gtk_box_pack_start(GTK_BOX(hbox1), label1, TRUE, TRUE, 0); - gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5); - - frame1 = gtk_frame_new("Debug log"); - gtk_widget_show(frame1); - gtk_box_pack_start(GTK_BOX(vbox1), frame1, TRUE, TRUE, 0); - - scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow1); - 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); - - text1 = gtk_text_view_new(); - gtk_text_view_set_editable(GTK_TEXT_VIEW(text1), FALSE); - gtk_widget_show(text1); - gtk_container_add(GTK_CONTAINER(scrolledwindow1), text1); - - crash_report = - g_strdup_printf - ("HardInfo version %s\nGTK+ version %d.%d.%d\nFeatures: %s\nOperating system: %s\nC Library: %s\n--\n%s", - VERSION, gtk_major_version, gtk_minor_version, gtk_micro_version, - get_compiled_in_features(), get_operating_system(), - get_lib_version(), debug_output); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text1)); - gtk_text_buffer_get_start_iter(buffer, &iter); - gtk_text_buffer_insert(buffer, &iter, crash_report, -1); - - g_free(crash_report); - - hbuttonbox3 = gtk_hbutton_box_new(); - gtk_widget_show(hbuttonbox3); - gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox3, FALSE, FALSE, 0); - - hbuttonbox4 = gtk_hbutton_box_new(); - gtk_widget_show(hbuttonbox4); - gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox4, FALSE, FALSE, 0); - - button3 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); - gtk_widget_show(button3); - gtk_container_add(GTK_CONTAINER(hbuttonbox4), button3); - - g_signal_connect(G_OBJECT(window1), "delete_event", - GTK_SIGNAL_FUNC(gtk_main_quit), NULL); - g_signal_connect(G_OBJECT(button3), "clicked", - GTK_SIGNAL_FUNC(gtk_main_quit), NULL); - - gtk_widget_show(window1); - - gtk_main(); - return window1; -} - - -/* - * ! \brief create debugger script file in publicit directory. all the - * other options (creating temp files) looked too convoluted. - */ -static gboolean -crash_create_debugger_file(void) -{ - gchar *filename = g_strconcat(g_get_home_dir(), G_DIR_SEPARATOR_S, - ".hardinfo", G_DIR_SEPARATOR_S, - DEBUGGERRC, NULL); - - g_file_set_contents(filename, DEBUG_SCRIPT, -1, NULL); - g_free(filename); - - return (TRUE); -} - -/* - * ! \brief launches debugger and attaches it to crashed hardinfo - */ -static void -crash_debug(unsigned long crash_pid, - gchar * exe_image, GString * debug_output) -{ - int choutput[2]; - pid_t pid; - - pipe(choutput); - - if (0 == (pid = fork())) { - char *argp[10]; - char **argptr = argp; - - setgid(getgid()); - setuid(getuid()); - - /* - * setup debugger to attach to crashed publicit - */ - *argptr++ = "gdb"; - *argptr++ = "--nw"; - *argptr++ = "--nx"; - *argptr++ = "--quiet"; - *argptr++ = "--batch"; - *argptr++ = "-x"; - *argptr++ = g_strconcat(g_get_home_dir(), G_DIR_SEPARATOR_S, - ".hardinfo", G_DIR_SEPARATOR_S, - DEBUGGERRC, NULL); - *argptr++ = exe_image; - *argptr++ = g_strdup_printf("%ld", crash_pid); - *argptr = NULL; - - /* - * redirect output to write end of pipe - */ - close(1); - dup(choutput[1]); - close(choutput[0]); - if (-1 == execvp("gdb", argp)) - puts("error execvp\n"); - } else { - char buf[100]; - int r; - - waitpid(pid, NULL, 0); - - /* - * make it non blocking - */ - if (-1 == fcntl(choutput[0], F_SETFL, O_NONBLOCK)) - puts("set to non blocking failed\n"); - - /* - * get the output - */ - do { - r = read(choutput[0], buf, sizeof buf - 1); - if (r > 0) { - buf[r] = 0; - g_string_append(debug_output, buf); - } - } while (r > 0); - - close(choutput[0]); - close(choutput[1]); - - /* - * kill the process we attached to - */ - kill(crash_pid, SIGCONT); - } -} - -/***/ - -/* - * ! \brief features - */ -static const gchar * -get_compiled_in_features(void) -{ - return g_strdup("None"); -} - -/***/ - -/* - * ! \brief library version - */ -static const gchar * -get_lib_version(void) -{ -#if defined(__GNU_LIBRARY__) - return g_strdup_printf("GNU libc %s", gnu_get_libc_version()); -#else - return g_strdup("Unknown"); -#endif -} - -/***/ - -/* - * ! \brief operating system - */ -static const gchar * -get_operating_system(void) -{ - struct utsname utsbuf; - uname(&utsbuf); - return g_strdup_printf("%s %s (%s)", - utsbuf.sysname, utsbuf.release, utsbuf.machine); -} - -/***/ - -/* - * ! \brief see if the crash dialog is allowed (because some developers - * may prefer to run hardinfo under gdb...) - */ -static gboolean -is_crash_dialog_allowed(void) -{ - return !getenv("HARDINFO_NO_CRASH"); -} - -/* - * ! \brief this handler will probably evolve into something better. - */ -static void -crash_handler(int sig) -{ - pid_t pid; - static volatile unsigned long crashed_ = 0; - - /* - * besides guarding entrancy it's probably also better - * to mask off signals - */ - if (crashed_) - return; - - crashed_++; - - /* - * gnome ungrabs focus, and flushes gdk. mmmh, good idea. - */ - gdk_pointer_ungrab(GDK_CURRENT_TIME); - gdk_keyboard_ungrab(GDK_CURRENT_TIME); - gdk_flush(); - - if (0 == (pid = fork())) { - char buf[50]; - char *args[4]; - - /* - * probably also some other parameters (like GTK+ ones). - * also we pass the full startup dir and the real command - * line typed in (argv0) - */ - args[0] = params.argv0; - args[1] = "--crash"; - sprintf(buf, "%ld,%d,%s", (long) getppid(), sig, params.argv0); - args[2] = buf; - args[3] = NULL; - - setgid(getgid()); - setuid(getuid()); - execvp(params.argv0, args); - } else { - waitpid(pid, NULL, 0); - crash_cleanup_exit(); - _exit(253); - } - - _exit(253); -} - -/* - * ! \brief put all the things here we can do before letting the program - * die - */ -static void -crash_cleanup_exit(void) -{ - ; -} diff --git a/hardinfo2/crash.h b/hardinfo2/crash.h deleted file mode 100644 index 7a169290..00000000 --- a/hardinfo2/crash.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 2002 by the Sylpheed Claws Team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef CRASH_H__ -#define CRASH_H__ - -#define DEBUGGERRC "debuggerrc" - -void crash_install_handlers (void); -void crash_main (const char *arg); - -#endif /* CRASH_H__ */ - diff --git a/hardinfo2/hardinfo.c b/hardinfo2/hardinfo.c index fd65603c..470611fe 100644 --- a/hardinfo2/hardinfo.c +++ b/hardinfo2/hardinfo.c @@ -25,7 +25,6 @@ #include <stock.h> #include <binreloc.h> -#include <crash.h> ProgramParameters params = { 0 }; @@ -117,7 +116,6 @@ int main(int argc, char **argv) /* initialize gui and start gtk+ main loop */ icon_cache_init(); stock_icons_init(); - crash_install_handlers(); shell_init(modules); diff --git a/hardinfo2/util.c b/hardinfo2/util.c index 7d27b966..d8f7522f 100644 --- a/hardinfo2/util.c +++ b/hardinfo2/util.c @@ -41,8 +41,6 @@ #include <sys/stat.h> #include <sys/types.h> -#include <crash.h> - #define KiB 1024 #define MiB 1048576 #define GiB 1073741824 @@ -326,19 +324,8 @@ void parameters_init(int *argc, char ***argv, ProgramParameters * param) static gboolean autoload_deps = FALSE; static gchar *report_format = NULL; static gchar **use_modules = NULL; -#ifdef CRASH_DIALOG - static gchar *crash_args = NULL; -#endif static GOptionEntry options[] = { -#ifdef CRASH_DIALOG - { - .long_name = "crash", - .short_name = 'c', - .arg = G_OPTION_ARG_STRING, - .arg_data = &crash_args, - .description = "invokes HardInfo crash handler; do not use directly"}, -#endif { .long_name = "generate-report", .short_name = 'r', @@ -402,17 +389,6 @@ void parameters_init(int *argc, char ***argv, ProgramParameters * param) param->autoload_deps = autoload_deps; param->argv0 = *(argv)[0]; -#ifdef CRASH_DIALOG - if (crash_args) { - DEBUG("invoking crash handler: %s", crash_args); - - gtk_init(argc, argv); - crash_main(crash_args); - - exit(0); - } -#endif - if (report_format && g_str_equal(report_format, "html")) param->report_format = REPORT_FORMAT_HTML; |