summaryrefslogtreecommitdiff
path: root/src/log.c
blob: 48b6210127322c712210f5a1b29c0e4423f612c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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 );
}