Commit f83d51d4 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont
Browse files

logger: dispatch message directly to the correct function + clean up

parent 63d1c692
......@@ -80,7 +80,7 @@ struct intf_sys_t
{
msg_subscription_t *p_sub;
FILE *p_file;
int i_mode;
const char *footer;
};
/*****************************************************************************
......@@ -89,11 +89,11 @@ struct intf_sys_t
static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * );
static void Overflow (void *, int, const msg_item_t *, const char *, va_list);
static void TextPrint (FILE *, int, const msg_item_t *, const char *);
static void HtmlPrint (FILE *, int, const msg_item_t *, const char *);
static void TextPrint(void *, int, const msg_item_t *, const char *, va_list);
static void HtmlPrint(void *, int, const msg_item_t *, const char *, va_list);
#ifdef HAVE_SYSLOG_H
static void SyslogPrint (int, const msg_item_t *, const char *);
static void SyslogPrint(void *, int, const msg_item_t *, const char *,
va_list);
#endif
/*****************************************************************************
......@@ -186,7 +186,6 @@ static int Open( vlc_object_t *p_this )
{
intf_thread_t *p_intf = (intf_thread_t *)p_this;
intf_sys_t *p_sys;
char *psz_mode;
CONSOLE_INTRO_MSG;
msg_Info( p_intf, "using logger." );
......@@ -196,93 +195,31 @@ static int Open( vlc_object_t *p_this )
if( p_sys == NULL )
return VLC_ENOMEM;
p_sys->i_mode = MODE_TEXT;
psz_mode = var_InheritString( p_intf, "logmode" );
if( psz_mode )
msg_callback_t cb = TextPrint;
const char *filename = LOG_FILE_TEXT, *header = TEXT_HEADER;
p_sys->footer = TEXT_FOOTER;
char *mode = var_InheritString( p_intf, "logmode" );
if( mode != NULL )
{
if( !strcmp( psz_mode, "text" ) )
;
else if( !strcmp( psz_mode, "html" ) )
if( !strcmp( mode, "html" ) )
{
p_sys->i_mode = MODE_HTML;
p_sys->footer = HTML_FOOTER;
header = HTML_HEADER;
cb = HtmlPrint;
}
#ifdef HAVE_SYSLOG_H
else if( !strcmp( psz_mode, "syslog" ) )
{
p_sys->i_mode = MODE_SYSLOG;
}
else if( !strcmp( mode, "syslog" ) )
cb = SyslogPrint;
#endif
else
{
msg_Warn( p_intf, "invalid log mode `%s', using `text'", psz_mode );
p_sys->i_mode = MODE_TEXT;
}
free( psz_mode );
else if( strcmp( mode, "text" ) )
msg_Warn( p_intf, "invalid log mode `%s', using `text'", mode );
free( mode );
}
else
{
msg_Warn( p_intf, "no log mode specified, using `text'" );
}
if( p_sys->i_mode != MODE_SYSLOG )
{
char *psz_file = var_InheritString( p_intf, "logfile" );
if( !psz_file )
{
#ifdef __APPLE__
char *home = config_GetUserDir(VLC_DOCUMENTS_DIR);
if( home == NULL
|| asprintf( &psz_file, "%s/"LOG_DIR"/%s", home,
(p_sys->i_mode == MODE_HTML) ? LOG_FILE_HTML
: LOG_FILE_TEXT ) == -1 )
psz_file = NULL;
free(home);
#else
switch( p_sys->i_mode )
{
case MODE_HTML:
psz_file = strdup( LOG_FILE_HTML );
break;
case MODE_TEXT:
default:
psz_file = strdup( LOG_FILE_TEXT );
break;
}
#endif
msg_Warn( p_intf, "no log filename provided, using `%s'",
psz_file );
}
/* Open the log file and remove any buffering for the stream */
msg_Dbg( p_intf, "opening logfile `%s'", psz_file );
p_sys->p_file = vlc_fopen( psz_file, "at" );
if( p_sys->p_file == NULL )
{
msg_Err( p_intf, "error opening logfile `%s'", psz_file );
free( p_sys );
free( psz_file );
return -1;
}
setvbuf( p_sys->p_file, NULL, _IONBF, 0 );
free( psz_file );
switch( p_sys->i_mode )
{
case MODE_HTML:
fputs( HTML_HEADER, p_sys->p_file );
break;
case MODE_TEXT:
default:
fputs( TEXT_HEADER, p_sys->p_file );
break;
}
}
else
{
p_sys->p_file = NULL;
#ifdef HAVE_SYSLOG_H
if( cb == SyslogPrint )
{
int i_facility;
char *psz_facility = var_InheritString( p_intf, "syslog-facility" );
if( psz_facility )
......@@ -313,12 +250,45 @@ static int Open( vlc_object_t *p_this )
}
openlog( "vlc", LOG_PID|LOG_NDELAY, i_facility );
#endif
p_sys->p_file = NULL;
}
else
#endif
{
char *psz_file = var_InheritString( p_intf, "logfile" );
if( !psz_file )
{
#ifdef __APPLE__
char *home = config_GetUserDir(VLC_DOCUMENTS_DIR);
if( home == NULL
|| asprintf( &psz_file, "%s/"LOG_DIR"/%s", home,
filename ) == -1 )
psz_file = NULL;
free(home);
filename = psz_file;
#endif
msg_Warn( p_intf, "no log filename provided, using `%s'",
filename );
}
else
filename = psz_file;
p_sys->p_sub = vlc_Subscribe( Overflow, p_intf );
/* Open the log file and remove any buffering for the stream */
msg_Dbg( p_intf, "opening logfile `%s'", filename );
p_sys->p_file = vlc_fopen( filename, "at" );
free( psz_file );
if( p_sys->p_file == NULL )
{
msg_Err( p_intf, "error opening logfile `%s': %m", filename );
free( p_sys );
return VLC_EGENERIC;
}
setvbuf( p_sys->p_file, NULL, _IONBF, 0 );
fputs( header, p_sys->p_file );
}
return 0;
p_sys->p_sub = vlc_Subscribe( cb, p_intf );
return VLC_SUCCESS;
}
/*****************************************************************************
......@@ -330,114 +300,108 @@ static void Close( vlc_object_t *p_this )
intf_sys_t *p_sys = p_intf->p_sys;
/* Flush the queue and unsubscribe from the message queue */
/* FIXME: flush */
vlc_Unsubscribe( p_sys->p_sub );
switch( p_sys->i_mode )
{
case MODE_HTML:
fputs( HTML_FOOTER, p_sys->p_file );
break;
/* Close the log file */
#ifdef HAVE_SYSLOG_H
case MODE_SYSLOG:
if( p_sys->p_file == NULL )
closelog();
break;
else
#endif
case MODE_TEXT:
default:
fputs( TEXT_FOOTER, p_sys->p_file );
break;
}
/* Close the log file */
if( p_sys->p_file )
{
fputs( p_sys->footer, p_sys->p_file );
fclose( p_sys->p_file );
}
/* Destroy structure */
free( p_sys );
}
/**
* Log a message
*/
static void Overflow (void *opaque, int type, const msg_item_t *p_item,
const char *format, va_list ap)
static bool IgnoreMessage( intf_thread_t *p_intf, int type )
{
intf_thread_t *p_intf = opaque;
intf_sys_t *p_sys = p_intf->p_sys;
char *str;
/* TODO: cache value... */
int verbosity = var_InheritInteger( p_intf, "log-verbose" );
if (verbosity == -1)
verbosity = var_InheritInteger( p_intf, "verbose" );
if( verbosity < 0 || verbosity < (type - VLC_MSG_ERR)
|| vasprintf( &str, format, ap) == -1 )
return;
int canc = vlc_savecancel();
switch( p_sys->i_mode )
{
case MODE_HTML:
HtmlPrint( p_sys->p_file, type, p_item, str );
break;
#ifdef HAVE_SYSLOG_H
case MODE_SYSLOG:
SyslogPrint( type, p_item, str );
break;
#endif
case MODE_TEXT:
default:
TextPrint( p_sys->p_file, type, p_item, str );
break;
}
vlc_restorecancel( canc );
free( str );
return verbosity < 0 || verbosity < (type - VLC_MSG_ERR);
}
static const char ppsz_type[4][11] = {
": ",
" error: ",
" warning: ",
" debug: ",
/*
* Logging callbacks
*/
static const char ppsz_type[4][9] = {
"",
" error",
" warning",
" debug",
};
static void TextPrint( FILE *stream, int type, const msg_item_t *item,
const char *str )
static void TextPrint( void *opaque, int type, const msg_item_t *item,
const char *fmt, va_list ap )
{
utf8_fprintf( stream, "%s%s%s\n", item->psz_module,
ppsz_type[type], str );
intf_thread_t *p_intf = opaque;
FILE *stream = p_intf->p_sys->p_file;
if( IgnoreMessage( p_intf, type ) )
return;
int canc = vlc_savecancel();
flockfile( stream );
utf8_fprintf( stream, "%s%s: ", item->psz_module, ppsz_type[type] );
utf8_fprintf( stream, fmt, ap );
fputc_unlocked( '\n', stream );
funlockfile( stream );
vlc_restorecancel( canc );
}
#ifdef HAVE_SYSLOG_H
static void SyslogPrint( int type, const msg_item_t *item, const char *str )
static void SyslogPrint( void *opaque, int type, const msg_item_t *item,
const char *fmt, va_list ap )
{
static const int i_prio[4] = { LOG_INFO, LOG_ERR, LOG_WARNING, LOG_DEBUG };
intf_thread_t *p_intf = opaque;
char *str;
int i_priority = i_prio[type];
if( IgnoreMessage( p_intf, type )
|| unlikely(vasprintf( &str, fmt, ap ) == -1) )
return;
int canc = vlc_savecancel();
if( item->psz_header != NULL )
syslog( i_priority, "[%s] %s%s%s", item->psz_header,
syslog( i_priority, "[%s] %s%s: %s", item->psz_header,
item->psz_module, ppsz_type[type], str );
else
syslog( i_priority, "%s%s%s",
syslog( i_priority, "%s%s: %s",
item->psz_module, ppsz_type[type], str );
vlc_restorecancel( canc );
free( str );
}
#endif
static void HtmlPrint( FILE *stream, int type, const msg_item_t *item,
const char *str )
static void HtmlPrint( void *opaque, int type, const msg_item_t *item,
const char *fmt, va_list ap )
{
static const char ppsz_color[4][30] = {
"<span style=\"color: #ffffff\">",
"<span style=\"color: #ff6666\">",
"<span style=\"color: #ffff66\">",
"<span style=\"color: #aaaaaa\">",
static const unsigned color[4] = {
0xffffff, 0xff6666, 0xffff66, 0xaaaaaa,
};
fprintf( stream, "%s%s%s%s</span>\n", item->psz_module,
ppsz_type[type], ppsz_color[type], str );
intf_thread_t *p_intf = opaque;
FILE *stream = p_intf->p_sys->p_file;
if( IgnoreMessage( p_intf, type ) )
return;
int canc = vlc_savecancel();
flockfile( stream );
fprintf( stream, "%s%s: <span style=\"color: #%06x\">",
item->psz_module, ppsz_type[type], color[type] );
/* FIXME: encode special ASCII characters */
fprintf( stream, fmt, ap );
fputs( "</span>\n", stream );
funlockfile( stream );
vlc_restorecancel( canc );
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment