syslog.c 4.16 KB
Newer Older
1
/*
Tinderbox User's avatar
Tinderbox User committed
2
 * Copyright (C) 2004, 2007, 2014  Internet Systems Consortium, Inc. ("ISC")
Mark Andrews's avatar
Mark Andrews committed
3
 * Copyright (C) 2001-2003  Internet Software Consortium.
4
 *
Automatic Updater's avatar
Automatic Updater committed
5
 * Permission to use, copy, modify, and/or distribute this software for any
6 7 8
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
Mark Andrews's avatar
Mark Andrews committed
9 10 11 12 13 14 15
 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
16 17
 */

Automatic Updater's avatar
Automatic Updater committed
18
/* $Id: syslog.c,v 1.10 2007/06/19 23:47:19 tbox Exp $ */
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

#include <config.h>

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <syslog.h>

#include <isc/bindevt.h>
#include <isc/result.h>
#include <isc/syslog.h>
#include <isc/util.h>

static HANDLE hAppLog = NULL;
static FILE *log_stream;
static int debug_level = 0;

static struct dsn_c_pvt_sfnt {
	int val;
	const char *strval;
} facilities[] = {
Danny Mayer's avatar
Danny Mayer committed
41 42 43
	{ LOG_KERN,		"kern" },
	{ LOG_USER,		"user" },
	{ LOG_MAIL,		"mail" },
44
	{ LOG_DAEMON,		"daemon" },
Danny Mayer's avatar
Danny Mayer committed
45
	{ LOG_AUTH,		"auth" },
46
	{ LOG_SYSLOG,		"syslog" },
Danny Mayer's avatar
Danny Mayer committed
47
	{ LOG_LPR,		"lpr" },
48
#ifdef LOG_NEWS
Danny Mayer's avatar
Danny Mayer committed
49
	{ LOG_NEWS,		"news" },
50 51
#endif
#ifdef LOG_UUCP
Danny Mayer's avatar
Danny Mayer committed
52
	{ LOG_UUCP,		"uucp" },
53 54
#endif
#ifdef LOG_CRON
Danny Mayer's avatar
Danny Mayer committed
55
	{ LOG_CRON,		"cron" },
56 57 58 59 60
#endif
#ifdef LOG_AUTHPRIV
	{ LOG_AUTHPRIV,		"authpriv" },
#endif
#ifdef LOG_FTP
Danny Mayer's avatar
Danny Mayer committed
61
	{ LOG_FTP,		"ftp" },
62 63 64 65 66 67 68 69 70
#endif
	{ LOG_LOCAL0,		"local0"},
	{ LOG_LOCAL1,		"local1"},
	{ LOG_LOCAL2,		"local2"},
	{ LOG_LOCAL3,		"local3"},
	{ LOG_LOCAL4,		"local4"},
	{ LOG_LOCAL5,		"local5"},
	{ LOG_LOCAL6,		"local6"},
	{ LOG_LOCAL7,		"local7"},
Danny Mayer's avatar
Danny Mayer committed
71
	{ 0,			NULL }
72 73 74 75 76 77 78 79 80
};

isc_result_t
isc_syslog_facilityfromstring(const char *str, int *facilityp) {
	int i;

	REQUIRE(str != NULL);
	REQUIRE(facilityp != NULL);

81
	for (i = 0; facilities[i].strval != NULL; i++) {
82 83 84 85 86 87 88 89 90 91 92 93
		if (strcasecmp(facilities[i].strval, str) == 0) {
			*facilityp = facilities[i].val;
			return (ISC_R_SUCCESS);
		}
	}
	return (ISC_R_NOTFOUND);
}

/*
 * Log to the NT Event Log
 */
void
Danny Mayer's avatar
Danny Mayer committed
94
syslog(int level, const char *fmt, ...) {
95 96 97 98 99 100 101 102 103 104 105
	va_list ap;
	char buf[1024];
	char *str[1];

	str[0] = buf;

	va_start(ap, fmt);
	vsprintf(buf, fmt, ap);
	va_end(ap);

	/* Make sure that the channel is open to write the event */
Danny Mayer's avatar
Danny Mayer committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
	if (hAppLog != NULL) {
		switch (level) {
		case LOG_INFO:
		case LOG_NOTICE:
		case LOG_DEBUG:
			ReportEvent(hAppLog, EVENTLOG_INFORMATION_TYPE, 0,
				    BIND_INFO_MSG, NULL, 1, 0, str, NULL);
			break;
		case LOG_WARNING:
			ReportEvent(hAppLog, EVENTLOG_WARNING_TYPE, 0,
				    BIND_WARN_MSG, NULL, 1, 0, str, NULL);
			break;
		default:
			ReportEvent(hAppLog, EVENTLOG_ERROR_TYPE, 0,
				    BIND_ERR_MSG, NULL, 1, 0, str, NULL);
			break;
122 123 124 125 126 127 128 129
		}
	}
}

/*
 * Initialize event logging
 */
void
Danny Mayer's avatar
Danny Mayer committed
130 131 132
openlog(const char *name, int flags, ...) {
	/* Get a handle to the Application event log */
	hAppLog = RegisterEventSource(NULL, name);
133 134
}

Danny Mayer's avatar
Danny Mayer committed
135 136 137 138 139
/*
 * Close the Handle to the application Event Log
 * We don't care whether or not we succeeded so ignore return values
 * In fact if we failed then we would have nowhere to put the message
 */
140
void
141
closelog(void) {
Danny Mayer's avatar
Danny Mayer committed
142
	DeregisterEventSource(hAppLog);
143 144 145 146 147 148
}

/*
 * Keep event logging synced with the current debug level
 */
void
Danny Mayer's avatar
Danny Mayer committed
149
ModifyLogLevel(int level) {
Tinderbox User's avatar
Tinderbox User committed
150
	debug_level = level;
151 152 153 154 155 156 157
}

/*
 * Initialize logging for the port section of libbind.
 * Piggyback onto stream given.
 */
void
Danny Mayer's avatar
Danny Mayer committed
158
InitNTLogging(FILE *stream, int debug) {
159 160 161
	log_stream = stream;
	ModifyLogLevel(debug);
}
162 163 164 165 166 167 168 169 170
/*
 * This function is for reporting errors to the application
 * event log in case the regular syslog is not available
 * mainly during startup. It should not be used under normal
 * circumstances.
 */
void
NTReportError(const char *name, const char *str) {
	HANDLE hNTAppLog = NULL;
171 172 173
	const char *buf[1];

	buf[0] = str;
174 175 176 177

	hNTAppLog = RegisterEventSource(NULL, name);

	ReportEvent(hNTAppLog, EVENTLOG_ERROR_TYPE, 0,
178
		    BIND_ERR_MSG, NULL, 1, 0, buf, NULL);
Danny Mayer's avatar
Danny Mayer committed
179

180
	DeregisterEventSource(hNTAppLog);
181
}