Huge thanks to our Platinum Members Endace and LiveAction,
and our Silver Member Veeam, for supporting the Wireshark Foundation and project.

Wireshark-dev: Re: [Wireshark-dev] Build fails on SuSE 11.3, print_stream.c:151: error: implici

From: Gerald Combs <gerald@xxxxxxxxxxxxx>
Date: Fri, 13 May 2016 15:38:49 -0700
On 5/13/16 8:00 AM, Guy Harris wrote:
> On May 13, 2016, at 3:15 AM, Anders Broman <anders.broman@xxxxxxxxxxxx> wrote:
> 
>> The reporter says:
>> glib2-lang-2.22.5-0.2.23
>> glib2-2.22.5-0.2.23
> 
> And, annoyingly, GLib 2.22.5 *defines* g_get_codeset() in glib/gutils.c, but doesn't bother *declaring* it in glib/gutils.h, unlike other routines such as, for example, g_atexit(), which *is* declared in glib/gutils.h.
> 
> Equally annoyingly, they don't mention g_get_codeset() anywhere in the NEWS file.
> 
> However:
> 
> 	g_get_codeset() appears to be a thin wrapper around g_get_charset();
> 
> 	g_get_charset() is documented as "[obtaining] the character set for the current locale" and g_get_codeset is documented as "[getting] the character set for the current locale", which sounds as if g_get_codeset() is no *better* at getting the character set for the current locale;
> 
> 	g_get_codeset() merely discards the Boolean return value of g_get_charset(), which is TRUE if it's UTF-8 and FALSE otherwise, and does a g_strdup() of the string provided by g_get_charset();
> 
> 	g_get_charset() *is* declared in glib/gunicode.h, which is included in glib/glib.h;
> 
> so perhaps we should just use g_get_charset():
> 
> diff --git a/epan/print_stream.c b/epan/print_stream.c
> index 740773a..4bb427d 100644
> --- a/epan/print_stream.c
> +++ b/epan/print_stream.c
> @@ -146,14 +146,14 @@ print_line_text(print_stream_t *self, int indent, const char *line)
>  #ifndef _WIN32
>          /* Is there a more reliable way to do this? */
>          if (!tty_codeset) {
> -            gchar *upper_codeset;
> +            gchar *charset;
> +            gboolean is_utf8;
>  
> -            tty_codeset = g_get_codeset();
> -            upper_codeset = g_ascii_strup(tty_codeset, -1);
> -            if (!strstr(upper_codeset, "UTF-8") && !strstr(upper_codeset, "UTF8")) {
> +            is_utf8 = g_get_charset(&charset);
> +            tty_codeset = g_strdup(charset);
> +            if (!is_utf8) {
>                  to_codeset = tty_codeset;
>              }
> -            g_free(upper_codeset);
>          }
>  #endif
> 
> or something such as that.
> 
> Now, GLib doesn't check for "UTF8", just "UTF-8", and assumes that the string doesn't have "utf-8" (or "UtF-8" or "uTF-8" or...), so maybe it's not as reliable as is necessary; if we need to worry about something other than "UTF-8" being included in the string, then we'd leave our string-checking in place and ignore the return value of g_get_charset().
> 
> I'm not sure whether the g_strdup() is necessary; if the string provided by g_get_charset() never gets changed or freed, it's not necessary.

Done, with minor changes in https://code.wireshark.org/review/#/c/15421/