xref: /minix/external/bsd/bind/dist/lib/isc/win32/syslog.c (revision 00b67f09)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: syslog.c,v 1.5 2014/12/10 04:38:01 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2007, 2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 2001-2003  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: syslog.c,v 1.10 2007/06/19 23:47:19 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <stdio.h>
25*00b67f09SDavid van Moolenbroek #include <windows.h>
26*00b67f09SDavid van Moolenbroek #include <string.h>
27*00b67f09SDavid van Moolenbroek #include <stdlib.h>
28*00b67f09SDavid van Moolenbroek #include <syslog.h>
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #include <isc/bindevt.h>
31*00b67f09SDavid van Moolenbroek #include <isc/result.h>
32*00b67f09SDavid van Moolenbroek #include <isc/syslog.h>
33*00b67f09SDavid van Moolenbroek #include <isc/util.h>
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek static HANDLE hAppLog = NULL;
36*00b67f09SDavid van Moolenbroek static FILE *log_stream;
37*00b67f09SDavid van Moolenbroek static int debug_level = 0;
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek static struct dsn_c_pvt_sfnt {
40*00b67f09SDavid van Moolenbroek 	int val;
41*00b67f09SDavid van Moolenbroek 	const char *strval;
42*00b67f09SDavid van Moolenbroek } facilities[] = {
43*00b67f09SDavid van Moolenbroek 	{ LOG_KERN,		"kern" },
44*00b67f09SDavid van Moolenbroek 	{ LOG_USER,		"user" },
45*00b67f09SDavid van Moolenbroek 	{ LOG_MAIL,		"mail" },
46*00b67f09SDavid van Moolenbroek 	{ LOG_DAEMON,		"daemon" },
47*00b67f09SDavid van Moolenbroek 	{ LOG_AUTH,		"auth" },
48*00b67f09SDavid van Moolenbroek 	{ LOG_SYSLOG,		"syslog" },
49*00b67f09SDavid van Moolenbroek 	{ LOG_LPR,		"lpr" },
50*00b67f09SDavid van Moolenbroek #ifdef LOG_NEWS
51*00b67f09SDavid van Moolenbroek 	{ LOG_NEWS,		"news" },
52*00b67f09SDavid van Moolenbroek #endif
53*00b67f09SDavid van Moolenbroek #ifdef LOG_UUCP
54*00b67f09SDavid van Moolenbroek 	{ LOG_UUCP,		"uucp" },
55*00b67f09SDavid van Moolenbroek #endif
56*00b67f09SDavid van Moolenbroek #ifdef LOG_CRON
57*00b67f09SDavid van Moolenbroek 	{ LOG_CRON,		"cron" },
58*00b67f09SDavid van Moolenbroek #endif
59*00b67f09SDavid van Moolenbroek #ifdef LOG_AUTHPRIV
60*00b67f09SDavid van Moolenbroek 	{ LOG_AUTHPRIV,		"authpriv" },
61*00b67f09SDavid van Moolenbroek #endif
62*00b67f09SDavid van Moolenbroek #ifdef LOG_FTP
63*00b67f09SDavid van Moolenbroek 	{ LOG_FTP,		"ftp" },
64*00b67f09SDavid van Moolenbroek #endif
65*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL0,		"local0"},
66*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL1,		"local1"},
67*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL2,		"local2"},
68*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL3,		"local3"},
69*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL4,		"local4"},
70*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL5,		"local5"},
71*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL6,		"local6"},
72*00b67f09SDavid van Moolenbroek 	{ LOG_LOCAL7,		"local7"},
73*00b67f09SDavid van Moolenbroek 	{ 0,			NULL }
74*00b67f09SDavid van Moolenbroek };
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek isc_result_t
isc_syslog_facilityfromstring(const char * str,int * facilityp)77*00b67f09SDavid van Moolenbroek isc_syslog_facilityfromstring(const char *str, int *facilityp) {
78*00b67f09SDavid van Moolenbroek 	int i;
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek 	REQUIRE(str != NULL);
81*00b67f09SDavid van Moolenbroek 	REQUIRE(facilityp != NULL);
82*00b67f09SDavid van Moolenbroek 
83*00b67f09SDavid van Moolenbroek 	for (i = 0; facilities[i].strval != NULL; i++) {
84*00b67f09SDavid van Moolenbroek 		if (strcasecmp(facilities[i].strval, str) == 0) {
85*00b67f09SDavid van Moolenbroek 			*facilityp = facilities[i].val;
86*00b67f09SDavid van Moolenbroek 			return (ISC_R_SUCCESS);
87*00b67f09SDavid van Moolenbroek 		}
88*00b67f09SDavid van Moolenbroek 	}
89*00b67f09SDavid van Moolenbroek 	return (ISC_R_NOTFOUND);
90*00b67f09SDavid van Moolenbroek }
91*00b67f09SDavid van Moolenbroek 
92*00b67f09SDavid van Moolenbroek /*
93*00b67f09SDavid van Moolenbroek  * Log to the NT Event Log
94*00b67f09SDavid van Moolenbroek  */
95*00b67f09SDavid van Moolenbroek void
syslog(int level,const char * fmt,...)96*00b67f09SDavid van Moolenbroek syslog(int level, const char *fmt, ...) {
97*00b67f09SDavid van Moolenbroek 	va_list ap;
98*00b67f09SDavid van Moolenbroek 	char buf[1024];
99*00b67f09SDavid van Moolenbroek 	char *str[1];
100*00b67f09SDavid van Moolenbroek 
101*00b67f09SDavid van Moolenbroek 	str[0] = buf;
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek 	va_start(ap, fmt);
104*00b67f09SDavid van Moolenbroek 	vsprintf(buf, fmt, ap);
105*00b67f09SDavid van Moolenbroek 	va_end(ap);
106*00b67f09SDavid van Moolenbroek 
107*00b67f09SDavid van Moolenbroek 	/* Make sure that the channel is open to write the event */
108*00b67f09SDavid van Moolenbroek 	if (hAppLog != NULL) {
109*00b67f09SDavid van Moolenbroek 		switch (level) {
110*00b67f09SDavid van Moolenbroek 		case LOG_INFO:
111*00b67f09SDavid van Moolenbroek 		case LOG_NOTICE:
112*00b67f09SDavid van Moolenbroek 		case LOG_DEBUG:
113*00b67f09SDavid van Moolenbroek 			ReportEvent(hAppLog, EVENTLOG_INFORMATION_TYPE, 0,
114*00b67f09SDavid van Moolenbroek 				    BIND_INFO_MSG, NULL, 1, 0, str, NULL);
115*00b67f09SDavid van Moolenbroek 			break;
116*00b67f09SDavid van Moolenbroek 		case LOG_WARNING:
117*00b67f09SDavid van Moolenbroek 			ReportEvent(hAppLog, EVENTLOG_WARNING_TYPE, 0,
118*00b67f09SDavid van Moolenbroek 				    BIND_WARN_MSG, NULL, 1, 0, str, NULL);
119*00b67f09SDavid van Moolenbroek 			break;
120*00b67f09SDavid van Moolenbroek 		default:
121*00b67f09SDavid van Moolenbroek 			ReportEvent(hAppLog, EVENTLOG_ERROR_TYPE, 0,
122*00b67f09SDavid van Moolenbroek 				    BIND_ERR_MSG, NULL, 1, 0, str, NULL);
123*00b67f09SDavid van Moolenbroek 			break;
124*00b67f09SDavid van Moolenbroek 		}
125*00b67f09SDavid van Moolenbroek 	}
126*00b67f09SDavid van Moolenbroek }
127*00b67f09SDavid van Moolenbroek 
128*00b67f09SDavid van Moolenbroek /*
129*00b67f09SDavid van Moolenbroek  * Initialize event logging
130*00b67f09SDavid van Moolenbroek  */
131*00b67f09SDavid van Moolenbroek void
openlog(const char * name,int flags,...)132*00b67f09SDavid van Moolenbroek openlog(const char *name, int flags, ...) {
133*00b67f09SDavid van Moolenbroek 	/* Get a handle to the Application event log */
134*00b67f09SDavid van Moolenbroek 	hAppLog = RegisterEventSource(NULL, name);
135*00b67f09SDavid van Moolenbroek }
136*00b67f09SDavid van Moolenbroek 
137*00b67f09SDavid van Moolenbroek /*
138*00b67f09SDavid van Moolenbroek  * Close the Handle to the application Event Log
139*00b67f09SDavid van Moolenbroek  * We don't care whether or not we succeeded so ignore return values
140*00b67f09SDavid van Moolenbroek  * In fact if we failed then we would have nowhere to put the message
141*00b67f09SDavid van Moolenbroek  */
142*00b67f09SDavid van Moolenbroek void
closelog(void)143*00b67f09SDavid van Moolenbroek closelog(void) {
144*00b67f09SDavid van Moolenbroek 	DeregisterEventSource(hAppLog);
145*00b67f09SDavid van Moolenbroek }
146*00b67f09SDavid van Moolenbroek 
147*00b67f09SDavid van Moolenbroek /*
148*00b67f09SDavid van Moolenbroek  * Keep event logging synced with the current debug level
149*00b67f09SDavid van Moolenbroek  */
150*00b67f09SDavid van Moolenbroek void
ModifyLogLevel(int level)151*00b67f09SDavid van Moolenbroek ModifyLogLevel(int level) {
152*00b67f09SDavid van Moolenbroek 	debug_level = level;
153*00b67f09SDavid van Moolenbroek }
154*00b67f09SDavid van Moolenbroek 
155*00b67f09SDavid van Moolenbroek /*
156*00b67f09SDavid van Moolenbroek  * Initialize logging for the port section of libbind.
157*00b67f09SDavid van Moolenbroek  * Piggyback onto stream given.
158*00b67f09SDavid van Moolenbroek  */
159*00b67f09SDavid van Moolenbroek void
InitNTLogging(FILE * stream,int debug)160*00b67f09SDavid van Moolenbroek InitNTLogging(FILE *stream, int debug) {
161*00b67f09SDavid van Moolenbroek 	log_stream = stream;
162*00b67f09SDavid van Moolenbroek 	ModifyLogLevel(debug);
163*00b67f09SDavid van Moolenbroek }
164*00b67f09SDavid van Moolenbroek /*
165*00b67f09SDavid van Moolenbroek  * This function is for reporting errors to the application
166*00b67f09SDavid van Moolenbroek  * event log in case the regular syslog is not available
167*00b67f09SDavid van Moolenbroek  * mainly during startup. It should not be used under normal
168*00b67f09SDavid van Moolenbroek  * circumstances.
169*00b67f09SDavid van Moolenbroek  */
170*00b67f09SDavid van Moolenbroek void
NTReportError(const char * name,const char * str)171*00b67f09SDavid van Moolenbroek NTReportError(const char *name, const char *str) {
172*00b67f09SDavid van Moolenbroek 	HANDLE hNTAppLog = NULL;
173*00b67f09SDavid van Moolenbroek 	const char *buf[1];
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek 	buf[0] = str;
176*00b67f09SDavid van Moolenbroek 
177*00b67f09SDavid van Moolenbroek 	hNTAppLog = RegisterEventSource(NULL, name);
178*00b67f09SDavid van Moolenbroek 
179*00b67f09SDavid van Moolenbroek 	ReportEvent(hNTAppLog, EVENTLOG_ERROR_TYPE, 0,
180*00b67f09SDavid van Moolenbroek 		    BIND_ERR_MSG, NULL, 1, 0, buf, NULL);
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 	DeregisterEventSource(hNTAppLog);
183*00b67f09SDavid van Moolenbroek }
184