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