diff options
Diffstat (limited to 'src/log.c')
-rw-r--r-- | src/log.c | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..48b6210 --- /dev/null +++ b/src/log.c @@ -0,0 +1,160 @@ +#include "log.h" + +#include "port/stdio.h" /* for vsnprintf */ +#include "port/string.h" /* for strcmp */ + +#include <stdarg.h> /* for variable arguments */ + +const char *log_syslog_facility_to_str( int facility ) { + switch( facility ) { + case LOG_KERN: return "KERN"; + case LOG_USER: return "USER"; + case LOG_MAIL: return "MAIL"; + case LOG_DAEMON: return "DAEMON"; + case LOG_AUTH: return "AUTH"; + case LOG_SYSLOG: return "SYSLOG"; + case LOG_LPR: return "LPR"; + case LOG_NEWS: return "NEWS"; + case LOG_UUCP: return "UUCP"; + case LOG_CRON: return "CRON"; +#if defined LOG_AUTHPRIV + case LOG_AUTHPRIV: return "AUTHPRIV"; +#endif +#if defined LOG_FTP + case LOG_FTP: return "FTP"; +#endif + default: return "<unknown"; + } +} + +int log_str_to_syslog_facility( const char *facility ) { + if( strcmp( facility, "KERN" ) == 0 ) return LOG_KERN; + if( strcmp( facility, "USER" ) == 0 ) return LOG_USER; + if( strcmp( facility, "MAIL" ) == 0 ) return LOG_MAIL; + if( strcmp( facility, "DAEMON" ) == 0 ) return LOG_DAEMON; + if( strcmp( facility, "AUTH" ) == 0 ) return LOG_AUTH; + if( strcmp( facility, "SYSLOG" ) == 0 ) return LOG_SYSLOG; + if( strcmp( facility, "LPR" ) == 0 ) return LOG_LPR; + if( strcmp( facility, "NEWS" ) == 0 ) return LOG_NEWS; + if( strcmp( facility, "UUCP" ) == 0 ) return LOG_UUCP; + if( strcmp( facility, "CRON" ) == 0 ) return LOG_CRON; +#if defined LOG_AUTHPRIV + if( strcmp( facility, "AUTHPRIV" ) == 0 ) return LOG_AUTHPRIV; +#endif +#if defined LOG_FTP + if( strcmp( facility, "FTP" ) == 0 ) return LOG_FTP; +#endif + + return LOG_DAEMON; +} + +const char *log_level_to_str( int level ) { + switch( level ) { + case LOG_EMERG: return "EMERG"; + case LOG_ALERT: return "ALERT"; + case LOG_CRIT: return "CRIT"; + case LOG_ERR: return "ERR"; + case LOG_WARNING: return "WARNING"; + case LOG_NOTICE: return "NOTICE"; + case LOG_INFO: return "INFO"; + case LOG_DEBUG: return "DEBUG"; + case LOG_DEBUG1: return "DEBUG1"; + case LOG_DEBUG2: return "DEBUG2"; + case LOG_DEBUG3: return "DEBUG3"; + case LOG_DEBUG4: return "DEBUG4"; + case LOG_DEBUG5: return "DEBUG5"; + default: return "<unknown>"; + } +} + +int log_str_to_level( const char *level ) { + if( strcmp( level, "EMERG" ) == 0 ) return LOG_EMERG; + if( strcmp( level, "ALERT" ) == 0 ) return LOG_ALERT; + if( strcmp( level, "CRIT" ) == 0 ) return LOG_CRIT; + if( strcmp( level, "ERR" ) == 0 ) return LOG_ERR; + if( strcmp( level, "WARNING" ) == 0 ) return LOG_WARNING; + if( strcmp( level, "NOTICE" ) == 0 ) return LOG_NOTICE; + if( strcmp( level, "INFO" ) == 0 ) return LOG_INFO; + if( strcmp( level, "DEBUG" ) == 0 ) return LOG_DEBUG; + if( strcmp( level, "DEBUG1" ) == 0 ) return LOG_DEBUG1; + if( strcmp( level, "DEBUG2" ) == 0 ) return LOG_DEBUG2; + if( strcmp( level, "DEBUG3" ) == 0 ) return LOG_DEBUG3; + if( strcmp( level, "DEBUG4" ) == 0 ) return LOG_DEBUG4; + if( strcmp( level, "DEBUG5" ) == 0 ) return LOG_DEBUG5; + + return LOG_NOTICE; +} + +static const char *log_logfile_filename; +static FILE *log_file = NULL; +static int log_logfile_level = -1; +static int log_stderr_level = -1; +static const char *syslog_ident = NULL; +static int syslog_facility; +static int syslog_level; + +void openlogtofile( const char *filename, int level ) { + if( log_file != NULL ) { + fclose( log_file ); + } + log_file = fopen( filename, "a" ); + log_logfile_filename = filename; + log_logfile_level = level; +} + +void openlogtosyslog( const char *ident, int facility, int level ) { + openlog( ident, LOG_CONS | LOG_NDELAY, facility ); + setlogmask( LOG_UPTO( level ) ); + syslog_ident = ident; + syslog_facility = facility; + syslog_level = level; +} + +void openlogtostderr( int level ) { + log_stderr_level = level; +} + +void closelogtofile( void ) { + if( log_file != NULL ) { + fclose( log_file ); + log_file = NULL; + } +} + +void closelogtosyslog( void ) { + closelog( ); +} + +void closelogtostderr( void ) { + /* do nothing here */ +} + +void reopenlogtofile( void ) { + if( log_file != NULL ) { + fclose( log_file ); + } + log_file = fopen( log_logfile_filename, "a" ); +} + +void reopenlogtosyslog( void ) { + openlog( syslog_ident, LOG_CONS | LOG_NDELAY, syslog_facility ); + setlogmask( LOG_UPTO( syslog_level ) ); +} + +void LOG( int level, const char *format, ... ) { + va_list ap; + char s[1024]; + va_start( ap, format ); + vsnprintf( s, 1024, format, ap ); + va_end( ap ); + + if( level <= log_stderr_level ) + fprintf( stderr, "%s: %s\n", log_level_to_str( level ), s ); + + if( level <= log_logfile_level ) { + fprintf( log_file, "%s: %s\n", log_level_to_str( level ), s ); + fflush( log_file ); + } + + syslog( level, "%s", s ); +} |