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