Mercurial > pidgin.yaz
changeset 24851:bbcdb1786eda
Redirect stderr to the debug window.
This should be useful when some libraries (e.g. libnm etc.) print stuff
to the stderr.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Wed, 31 Dec 2008 23:49:36 +0000 |
parents | 289227f729ec |
children | b2f8b1e1e7cc |
files | ChangeLog finch/gntdebug.c |
diffstat | 2 files changed, 48 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Wed Dec 31 23:42:28 2008 +0000 +++ b/ChangeLog Wed Dec 31 23:49:36 2008 +0000 @@ -16,6 +16,9 @@ * Fix a crash in the Add Account dialog when changing protocols under certain circumstances. + Finch: + * Redirect stderr outputs to the debug window. + version 2.5.3 (12/20/2008): libpurple: * The Buddy State Notification plugin no longer prints duplicate
--- a/finch/gntdebug.c Wed Dec 31 23:42:28 2008 +0000 +++ b/finch/gntdebug.c Wed Dec 31 23:49:36 2008 +0000 @@ -43,6 +43,48 @@ #define PREF_ROOT "/finch/debug" +static gboolean +handle_fprintf_stderr_cb(GIOChannel *source, GIOCondition cond, gpointer null) +{ + gssize size; + char message[1024]; + + size = read(g_io_channel_unix_get_fd(source), message, sizeof(message) - 1); + if (size <= 0) { + /* Something bad probably happened elsewhere ... let's ignore */ + } else { + message[size] = '\0'; + g_log("stderr", G_LOG_LEVEL_WARNING, "%s", message); + } + + return TRUE; +} + +static void +handle_fprintf_stderr(gboolean stop) +{ + GIOChannel *stderrch; + static int readhandle = -1; + int pipes[2]; + + if (stop) { + if (readhandle >= 0) { + g_source_remove(readhandle); + readhandle = -1; + } + return; + } + pipe(pipes); + dup2(pipes[1], STDERR_FILENO); + + stderrch = g_io_channel_unix_new(pipes[0]); + g_io_channel_set_close_on_unref(stderrch, TRUE); + readhandle = g_io_add_watch_full(stderrch, G_PRIORITY_HIGH, + G_IO_IN | G_IO_ERR | G_IO_PRI, + handle_fprintf_stderr_cb, NULL, NULL); + g_io_channel_unref(stderrch); +} + static struct { GntWidget *window; @@ -143,10 +185,6 @@ } static void -suppress_error_messages(const char *message) -{} - -static void toggle_pause(GntWidget *w, gpointer n) { debug.paused = !debug.paused; @@ -348,10 +386,11 @@ #ifdef USE_GSTREAMER REGISTER_G_LOG_HANDLER("GStreamer"); #endif + REGISTER_G_LOG_HANDLER("stderr"); g_set_print_handler(print_stderr); /* Redirect the debug messages to stderr */ if (!purple_debug_is_enabled()) - g_set_printerr_handler(suppress_error_messages); + handle_fprintf_stderr(FALSE); purple_prefs_add_none(PREF_ROOT); purple_prefs_add_string(PREF_ROOT "/filter", ""); @@ -365,5 +404,6 @@ void finch_debug_uninit() { + handle_fprintf_stderr(TRUE); }