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