/* $CoreSDI: winsyslog.c,v 1.4 2001/10/05 23:14:58 claudio Exp $ */ /* * Copyright (c) 2000, 2001, Core SDI S.A., Argentina * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither name of the Core SDI S.A. nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Win32 syslog wrapper. * Author: Claudio Castiglia, CoreSDI S.A. */ #include #include "sysdep.h" #include "winsyslog.h" static const char *logident = NULL; static int logflags = 0; /* * _level2type(): * Converts syslog level to windows message type. */ static WORD _level2type(int level) { switch (level) { case LOG_ERR: return (EVENTLOG_ERROR_TYPE); case LOG_WARNING: return (EVENTLOG_WARNING_TYPE); case LOG_INFO: case LOG_DEBUG: default:; } return (EVENTLOG_INFORMATION_TYPE); } /* * openlog() */ void openlog(const char *ident, int logopt, int facility) { if (ident != NULL) logident = ident; logflags = logopt; } /* * closelog() */ void closelog() { } /* * vsyslog() */ void vsyslog(int pri, const char *fmt, va_list ap) { HANDLE handle; char source[256], buf[LINE_MAX], *name, *msg; /* Create message */ name = (logident == NULL) ? "" : logident; if (logflags & LOG_PID) _snprintf(source, sizeof(source), "%s[%d]", name, GetCurrentProcessId()); else _snprintf(source, sizeof(source), "%s", name); _vsnprintf(buf, sizeof(buf), fmt, ap); /* Send message to the local eventlogger */ if ( (handle = RegisterEventSource(NULL, TEXT(name))) != NULL) { /* XXX: 1. need more work yet. * 2. id = 0 => ? * 3. facility is not used, priority = level */ msg = buf; ReportEvent(handle, _level2type(pri), 0, 0, NULL, 1, 0, &msg, NULL); DeregisterEventSource(handle); } }