summaryrefslogtreecommitdiff
path: root/src/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/log.c')
-rw-r--r--src/log.c160
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 );
+}