]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/lib/isc/win32/syslog.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ntp / lib / isc / win32 / syslog.c
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
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
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
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
141 closelog() {
142         DeregisterEventSource(hAppLog);
143 }
144
145 /*
146  * Keep event logging synced with the current debug level
147  */
148 void
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
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
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 }