2001-08-21 16:56:08 +04:00
/*
2001-10-03 15:06:31 +04:00
* Copyright ( C ) 2001 Sistina Software ( UK ) Limited .
2001-08-21 16:56:08 +04:00
*
2001-10-31 15:47:01 +03:00
* This file is released under the LGPL .
2001-08-21 16:56:08 +04:00
*/
# include "log.h"
# include <stdarg.h>
# include <syslog.h>
static FILE * _log = 0 ;
static int _verbose_level = 0 ;
static int _test = 0 ;
2002-01-29 20:23:33 +03:00
static int _partial = 0 ;
2001-08-21 16:56:08 +04:00
static int _debug_level = 0 ;
static int _syslog = 0 ;
2002-01-22 18:33:40 +03:00
static int _indent = 1 ;
static int _log_cmd_name = 0 ;
static char _cmd_name [ 30 ] = " " ;
static char _msg_prefix [ 30 ] = " " ;
2001-08-21 16:56:08 +04:00
void init_log ( FILE * fp ) {
_log = fp ;
}
void init_syslog ( int facility ) {
openlog ( " lvm " , LOG_PID , facility ) ;
_syslog = 1 ;
}
void fin_log ( ) {
_log = 0 ;
}
void fin_syslog ( ) {
2002-01-19 00:26:37 +03:00
if ( _syslog )
closelog ( ) ;
2001-08-21 16:56:08 +04:00
_syslog = 0 ;
}
void init_verbose ( int level ) {
_verbose_level = level ;
}
void init_test ( int level ) {
_test = level ;
2002-01-01 00:27:39 +03:00
if ( _test )
log_print ( " Test mode. Metadata will NOT be updated. " ) ;
2001-08-21 16:56:08 +04:00
}
2002-01-29 20:23:33 +03:00
void init_partial ( int level ) {
_partial = level ;
}
2002-01-22 18:33:40 +03:00
void init_cmd_name ( int status ) {
_log_cmd_name = status ;
}
void set_cmd_name ( const char * cmd ) {
if ( ! _log_cmd_name )
return ;
strncpy ( _cmd_name , cmd , sizeof ( _cmd_name ) ) ;
_cmd_name [ sizeof ( _cmd_name ) - 1 ] = ' \0 ' ;
}
void init_msg_prefix ( const char * prefix ) {
strncpy ( _msg_prefix , prefix , sizeof ( _msg_prefix ) ) ;
_msg_prefix [ sizeof ( _msg_prefix ) - 1 ] = ' \0 ' ;
}
void init_indent ( int indent ) {
_indent = indent ;
}
2001-08-21 16:56:08 +04:00
int test_mode ( ) {
return _test ;
}
2002-01-29 20:23:33 +03:00
int partial_mode ( ) {
return _partial ;
}
2001-08-21 16:56:08 +04:00
void init_debug ( int level ) {
_debug_level = level ;
}
int debug_level ( ) {
return _debug_level ;
}
void print_log ( int level , const char * file , int line , const char * format , . . . ) {
va_list ap ;
va_start ( ap , format ) ;
switch ( level ) {
case _LOG_DEBUG :
2002-02-21 00:26:40 +03:00
if ( ! strcmp ( " <backtrace> " , format ) )
break ;
2002-02-11 21:25:18 +03:00
if ( _verbose_level > 2 ) {
2002-01-22 18:33:40 +03:00
printf ( " %s%s " , _cmd_name , _msg_prefix ) ;
if ( _indent )
printf ( " " ) ;
2001-08-21 16:56:08 +04:00
vprintf ( format , ap ) ;
putchar ( ' \n ' ) ;
}
break ;
case _LOG_INFO :
if ( _verbose_level > 1 ) {
2002-01-22 18:33:40 +03:00
printf ( " %s%s " , _cmd_name , _msg_prefix ) ;
if ( _indent )
printf ( " " ) ;
2001-08-21 16:56:08 +04:00
vprintf ( format , ap ) ;
putchar ( ' \n ' ) ;
}
break ;
case _LOG_NOTICE :
if ( _verbose_level ) {
2002-01-22 18:33:40 +03:00
printf ( " %s%s " , _cmd_name , _msg_prefix ) ;
if ( _indent )
printf ( " " ) ;
2001-08-21 16:56:08 +04:00
vprintf ( format , ap ) ;
putchar ( ' \n ' ) ;
}
break ;
case _LOG_WARN :
2002-01-22 18:33:40 +03:00
printf ( " %s%s " , _cmd_name , _msg_prefix ) ;
2001-08-21 16:56:08 +04:00
vprintf ( format , ap ) ;
putchar ( ' \n ' ) ;
break ;
case _LOG_ERR :
2002-01-22 18:33:40 +03:00
fprintf ( stderr , " %s%s " , _cmd_name , _msg_prefix ) ;
2001-08-21 16:56:08 +04:00
vfprintf ( stderr , format , ap ) ;
fputc ( ' \n ' , stderr ) ;
break ;
case _LOG_FATAL :
2002-01-18 22:38:19 +03:00
default :
2002-01-22 18:33:40 +03:00
fprintf ( stderr , " %s%s " , _cmd_name , _msg_prefix ) ;
2001-08-21 16:56:08 +04:00
vfprintf ( stderr , format , ap ) ;
fputc ( ' \n ' , stderr ) ;
break ;
;
}
va_end ( ap ) ;
if ( level > _debug_level )
return ;
if ( _log ) {
2002-01-22 18:33:40 +03:00
fprintf ( _log , " %s:%d %s%s " , file , line , _cmd_name ,
_msg_prefix ) ;
2001-08-21 16:56:08 +04:00
va_start ( ap , format ) ;
vfprintf ( _log , format , ap ) ;
va_end ( ap ) ;
fprintf ( _log , " \n " ) ;
fflush ( _log ) ;
}
if ( _syslog ) {
va_start ( ap , format ) ;
vsyslog ( level , format , ap ) ;
va_end ( ap ) ;
}
}