1290001Sglebius/*
2290001Sglebius * Copyright (C) 2004, 2007  Internet Systems Consortium, Inc. ("ISC")
3290001Sglebius * Copyright (C) 2001-2003  Internet Software Consortium.
4290001Sglebius *
5290001Sglebius * Permission to use, copy, modify, and/or distribute this software for any
6290001Sglebius * purpose with or without fee is hereby granted, provided that the above
7290001Sglebius * copyright notice and this permission notice appear in all copies.
8290001Sglebius *
9290001Sglebius * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10290001Sglebius * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11290001Sglebius * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12290001Sglebius * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13290001Sglebius * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14290001Sglebius * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15290001Sglebius * PERFORMANCE OF THIS SOFTWARE.
16290001Sglebius */
17290001Sglebius
18290001Sglebius/* $Id: syslog.c,v 1.10 2007/06/19 23:47:19 tbox Exp $ */
19290001Sglebius
20290001Sglebius#include <config.h>
21290001Sglebius
22290001Sglebius#include <stdio.h>
23290001Sglebius#include <windows.h>
24290001Sglebius#include <string.h>
25290001Sglebius#include <stdlib.h>
26290001Sglebius#include <syslog.h>
27290001Sglebius
28290001Sglebius#include <isc/bindevt.h>
29290001Sglebius#include <isc/result.h>
30290001Sglebius#include <isc/syslog.h>
31290001Sglebius#include <isc/util.h>
32290001Sglebius
33290001Sglebiusstatic HANDLE hAppLog = NULL;
34290001Sglebiusstatic FILE *log_stream;
35290001Sglebiusstatic int debug_level = 0;
36290001Sglebius
37290001Sglebiusstatic struct dsn_c_pvt_sfnt {
38290001Sglebius	int val;
39290001Sglebius	const char *strval;
40290001Sglebius} facilities[] = {
41290001Sglebius	{ LOG_KERN,		"kern" },
42290001Sglebius	{ LOG_USER,		"user" },
43290001Sglebius	{ LOG_MAIL,		"mail" },
44290001Sglebius	{ LOG_DAEMON,		"daemon" },
45290001Sglebius	{ LOG_AUTH,		"auth" },
46290001Sglebius	{ LOG_SYSLOG,		"syslog" },
47290001Sglebius	{ LOG_LPR,		"lpr" },
48290001Sglebius#ifdef LOG_NEWS
49290001Sglebius	{ LOG_NEWS,		"news" },
50290001Sglebius#endif
51290001Sglebius#ifdef LOG_UUCP
52290001Sglebius	{ LOG_UUCP,		"uucp" },
53290001Sglebius#endif
54290001Sglebius#ifdef LOG_CRON
55290001Sglebius	{ LOG_CRON,		"cron" },
56290001Sglebius#endif
57290001Sglebius#ifdef LOG_AUTHPRIV
58290001Sglebius	{ LOG_AUTHPRIV,		"authpriv" },
59290001Sglebius#endif
60290001Sglebius#ifdef LOG_FTP
61290001Sglebius	{ LOG_FTP,		"ftp" },
62290001Sglebius#endif
63290001Sglebius	{ LOG_LOCAL0,		"local0"},
64290001Sglebius	{ LOG_LOCAL1,		"local1"},
65290001Sglebius	{ LOG_LOCAL2,		"local2"},
66290001Sglebius	{ LOG_LOCAL3,		"local3"},
67290001Sglebius	{ LOG_LOCAL4,		"local4"},
68290001Sglebius	{ LOG_LOCAL5,		"local5"},
69290001Sglebius	{ LOG_LOCAL6,		"local6"},
70290001Sglebius	{ LOG_LOCAL7,		"local7"},
71290001Sglebius	{ 0,			NULL }
72290001Sglebius};
73290001Sglebius
74290001Sglebiusisc_result_t
75290001Sglebiusisc_syslog_facilityfromstring(const char *str, int *facilityp) {
76290001Sglebius	int i;
77290001Sglebius
78290001Sglebius	REQUIRE(str != NULL);
79290001Sglebius	REQUIRE(facilityp != NULL);
80290001Sglebius
81290001Sglebius	for (i = 0; facilities[i].strval != NULL; i++) {
82290001Sglebius		if (strcasecmp(facilities[i].strval, str) == 0) {
83290001Sglebius			*facilityp = facilities[i].val;
84290001Sglebius			return (ISC_R_SUCCESS);
85290001Sglebius		}
86290001Sglebius	}
87290001Sglebius	return (ISC_R_NOTFOUND);
88290001Sglebius}
89290001Sglebius
90290001Sglebius/*
91290001Sglebius * Log to the NT Event Log
92290001Sglebius */
93290001Sglebiusvoid
94290001Sglebiussyslog(int level, const char *fmt, ...) {
95290001Sglebius	va_list ap;
96290001Sglebius	char buf[1024];
97290001Sglebius	char *str[1];
98290001Sglebius
99290001Sglebius	str[0] = buf;
100290001Sglebius
101290001Sglebius	va_start(ap, fmt);
102290001Sglebius	vsprintf(buf, fmt, ap);
103290001Sglebius	va_end(ap);
104290001Sglebius
105290001Sglebius	/* Make sure that the channel is open to write the event */
106290001Sglebius	if (hAppLog != NULL) {
107290001Sglebius		switch (level) {
108290001Sglebius		case LOG_INFO:
109290001Sglebius		case LOG_NOTICE:
110290001Sglebius		case LOG_DEBUG:
111290001Sglebius			ReportEvent(hAppLog, EVENTLOG_INFORMATION_TYPE, 0,
112290001Sglebius				    BIND_INFO_MSG, NULL, 1, 0, str, NULL);
113290001Sglebius			break;
114290001Sglebius		case LOG_WARNING:
115290001Sglebius			ReportEvent(hAppLog, EVENTLOG_WARNING_TYPE, 0,
116290001Sglebius				    BIND_WARN_MSG, NULL, 1, 0, str, NULL);
117290001Sglebius			break;
118290001Sglebius		default:
119290001Sglebius			ReportEvent(hAppLog, EVENTLOG_ERROR_TYPE, 0,
120290001Sglebius				    BIND_ERR_MSG, NULL, 1, 0, str, NULL);
121290001Sglebius			break;
122290001Sglebius		}
123290001Sglebius	}
124290001Sglebius}
125290001Sglebius
126290001Sglebius/*
127290001Sglebius * Initialize event logging
128290001Sglebius */
129290001Sglebiusvoid
130290001Sglebiusopenlog(const char *name, int flags, ...) {
131290001Sglebius	/* Get a handle to the Application event log */
132290001Sglebius	hAppLog = RegisterEventSource(NULL, name);
133290001Sglebius}
134290001Sglebius
135290001Sglebius/*
136290001Sglebius * Close the Handle to the application Event Log
137290001Sglebius * We don't care whether or not we succeeded so ignore return values
138290001Sglebius * In fact if we failed then we would have nowhere to put the message
139290001Sglebius */
140290001Sglebiusvoid
141290001Sglebiuscloselog() {
142290001Sglebius	DeregisterEventSource(hAppLog);
143290001Sglebius}
144290001Sglebius
145290001Sglebius/*
146290001Sglebius * Keep event logging synced with the current debug level
147290001Sglebius */
148290001Sglebiusvoid
149290001SglebiusModifyLogLevel(int level) {
150290001Sglebius	debug_level = level;
151290001Sglebius}
152290001Sglebius
153290001Sglebius/*
154290001Sglebius * Initialize logging for the port section of libbind.
155290001Sglebius * Piggyback onto stream given.
156290001Sglebius */
157290001Sglebiusvoid
158290001SglebiusInitNTLogging(FILE *stream, int debug) {
159290001Sglebius	log_stream = stream;
160290001Sglebius	ModifyLogLevel(debug);
161290001Sglebius}
162290001Sglebius/*
163290001Sglebius * This function is for reporting errors to the application
164290001Sglebius * event log in case the regular syslog is not available
165290001Sglebius * mainly during startup. It should not be used under normal
166290001Sglebius * circumstances.
167290001Sglebius */
168290001Sglebiusvoid
169290001SglebiusNTReportError(const char *name, const char *str) {
170290001Sglebius	HANDLE hNTAppLog = NULL;
171290001Sglebius	const char *buf[1];
172290001Sglebius
173290001Sglebius	buf[0] = str;
174290001Sglebius
175290001Sglebius	hNTAppLog = RegisterEventSource(NULL, name);
176290001Sglebius
177290001Sglebius	ReportEvent(hNTAppLog, EVENTLOG_ERROR_TYPE, 0,
178290001Sglebius		    BIND_ERR_MSG, NULL, 1, 0, buf, NULL);
179290001Sglebius
180290001Sglebius	DeregisterEventSource(hNTAppLog);
181290001Sglebius}
182