From ffe303d7937f478fccbb302c04e63e0cbfd7867e Mon Sep 17 00:00:00 2001 From: yaworsky Date: Tue, 29 Nov 2005 10:12:45 +0000 Subject: Convert TAG (program name) from source encoding to locale encoding if source encoding is specified and other than locale encoding. --- daemon/syslogd.c | 53 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) (limited to 'daemon/syslogd.c') diff --git a/daemon/syslogd.c b/daemon/syslogd.c index e4467b3..0a3b2b6 100644 --- a/daemon/syslogd.c +++ b/daemon/syslogd.c @@ -179,6 +179,30 @@ done: return ret; } +/****************************************************************************** + * try_convert_string + * + * helper function for mux_message; + * try to convert encoding, return reference to the original string in case + * of failure + */ +static struct string* try_convert_string( struct string* s, GIConv cd ) +{ + struct string *ret; + gchar *converted_str; + + converted_str = g_convert_with_iconv( s->gstr->str, -1, cd, NULL, NULL, NULL ); + if( !converted_str ) + { + TRACE( "conversion error\n" ); + return string_addref( s ); + } + + ret = string_new( converted_str ); + g_free( converted_str ); + return ret; +} + /****************************************************************************** * mux_message * @@ -194,6 +218,7 @@ static void mux_message( struct message* msg ) for( item = logpaths; item; item = item->next ) { struct logpath *logpath = item->data; + gboolean need_message_iconv, need_program_iconv; struct message *converted_msg; if( logpath->source != msg->source ) @@ -202,27 +227,29 @@ static void mux_message( struct message* msg ) if( !filter_message( msg, logpath->filter ) ) continue; - /* convert message encoding if needed */ - if( logpath->message_cd == (GIConv) -1 ) + /* convert encoding if needed */ + need_message_iconv = logpath->message_cd != (GIConv) -1; + need_program_iconv = logpath->program_cd != (GIConv) -1; + + if( (!need_message_iconv) && (!need_program_iconv) ) { converted_msg = msg; reference_message( msg ); } else { - gchar *c_message = g_convert_with_iconv( msg->message->gstr->str, -1, - logpath->message_cd, - NULL, NULL, NULL ); - if( !c_message ) + converted_msg = duplicate_message( msg ); + + if( need_message_iconv ) { - TRACE( "conversion error\n" ); - c_message = g_strdup( msg->message->gstr->str ); + string_release( converted_msg->message ); + converted_msg->message = try_convert_string( msg->message, logpath->message_cd ); + } + if( need_program_iconv ) + { + string_release( converted_msg->program ); + converted_msg->program = try_convert_string( msg->program, logpath->program_cd ); } - - converted_msg = duplicate_message( msg ); - string_release( converted_msg->message ); - converted_msg->message = string_new( c_message ); - g_free( c_message ); } /* put message to destination */ -- cgit v1.2.3