Submitted By: Bruce Dubbs Rediffed By: Douglas R. Reno Date: 2017-10-15 Rediffed Date: 2021-04-01 Initial Package Version: 2.54.0 Upstream Status: Not submitted Origin: Self Description: Adds a capabiility to skip printing warning messages using an environment variable: GLIB_LOG_LEVEL. The value of the variable is a digit that correponds to: 1 Alert 2 Critical 3 Error 4 Warning 5 Notice For instance GLIB_LOG_LEVEL=4 will skip output of Warning and Notice messages (and Info/Debug messages if they are turned on). Rediffed for 2.68.0 to reduce the fuzz warnings. diff -Naurp glib-2.68.0.orig/glib/gmessages.c glib-2.68.0/glib/gmessages.c --- glib-2.68.0.orig/glib/gmessages.c 2021-03-18 08:28:31.909625000 -0500 +++ glib-2.68.0/glib/gmessages.c 2021-04-01 20:32:23.517596280 -0500 @@ -528,6 +528,34 @@ static GDestroyNotify log_writer_user_da /* --- functions --- */ +/* skip_message + * + * This internal function queries an optional environment variable, + * GLIB_LOG_LEVEL and converts it to a value consistent + * with the type GLogLevelFlags. If the value is equal to + * or greater than the integer equivalent of the log_level, + * then the function returns a boolean that indicates that + * logging the output should be skipped. + */ + +static gboolean skip_message( GLogLevelFlags log_level); + +static gboolean skip_message( GLogLevelFlags log_level) +{ + char* user_log_level; + int user_log_int; + gboolean skip = FALSE; + + user_log_level = getenv( "GLIB_LOG_LEVEL" ); + + user_log_int = ( user_log_level != NULL ) ? atoi( user_log_level ) : 0; + user_log_int = ( user_log_level != 0 ) ? 1 << user_log_int : 0; + + if ( user_log_int >= log_level ) skip = TRUE; + + return skip; +} + static void _g_log_abort (gboolean breakpoint); static void @@ -2591,6 +2619,9 @@ g_log_writer_standard_streams (GLogLevel g_return_val_if_fail (fields != NULL, G_LOG_WRITER_UNHANDLED); g_return_val_if_fail (n_fields > 0, G_LOG_WRITER_UNHANDLED); + /* If the user does not want this message level, just return */ + if ( skip_message( log_level) ) return G_LOG_WRITER_HANDLED; + stream = log_level_to_file (log_level); if (!stream || fileno (stream) < 0) return G_LOG_WRITER_UNHANDLED; @@ -2818,6 +2849,9 @@ _g_log_writer_fallback (GLogLevelFlags FILE *stream; gsize i; + /* If the user does not want this message level, just return */ + if ( skip_message( log_level) ) return G_LOG_WRITER_HANDLED; + /* we cannot call _any_ GLib functions in this fallback handler, * which is why we skip UTF-8 conversion, etc. * since we either recursed or ran out of memory, we're in a pretty