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