Blame rpcapd/log.c

Packit 209cc3
/*
Packit 209cc3
 * Copyright (c) 1993, 1994, 1995, 1996, 1998
Packit 209cc3
 *	The Regents of the University of California.  All rights reserved.
Packit 209cc3
 *
Packit 209cc3
 * Redistribution and use in source and binary forms, with or without
Packit 209cc3
 * modification, are permitted provided that: (1) source code distributions
Packit 209cc3
 * retain the above copyright notice and this paragraph in its entirety, (2)
Packit 209cc3
 * distributions including binary code include the above copyright notice and
Packit 209cc3
 * this paragraph in its entirety in the documentation or other materials
Packit 209cc3
 * provided with the distribution, and (3) all advertising materials mentioning
Packit 209cc3
 * features or use of this software display the following acknowledgement:
Packit 209cc3
 * ``This product includes software developed by the University of California,
Packit 209cc3
 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
Packit 209cc3
 * the University nor the names of its contributors may be used to endorse
Packit 209cc3
 * or promote products derived from this software without specific prior
Packit 209cc3
 * written permission.
Packit 209cc3
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
Packit 209cc3
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
Packit 209cc3
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Packit 209cc3
 */
Packit 209cc3
Packit 209cc3
#ifdef HAVE_CONFIG_H
Packit 209cc3
#include <config.h>
Packit 209cc3
#endif
Packit 209cc3
Packit 209cc3
#include <stdio.h>
Packit 209cc3
#include <stdarg.h>
Packit 209cc3
#include <stdlib.h>
Packit 209cc3
Packit 209cc3
#ifdef _WIN32
Packit 209cc3
#include <windows.h>
Packit 209cc3
#else
Packit 209cc3
#include <syslog.h>
Packit 209cc3
#endif
Packit 209cc3
Packit 209cc3
#include "portability.h"
Packit 209cc3
Packit 209cc3
#include "log.h"
Packit 209cc3
Packit 209cc3
static int log_to_systemlog;
Packit 209cc3
static int log_debug_messages;
Packit 209cc3
Packit 209cc3
static void rpcapd_vlog_stderr(log_priority,
Packit 209cc3
    PCAP_FORMAT_STRING(const char *), va_list) PCAP_PRINTFLIKE(2, 0);
Packit 209cc3
Packit 209cc3
static void rpcapd_vlog_stderr(log_priority priority, const char *message, va_list ap)
Packit 209cc3
{
Packit 209cc3
	const char *tag;
Packit 209cc3
Packit 209cc3
	/*
Packit 209cc3
	 * Squelch warnings from compilers that *don't* assume that
Packit 209cc3
	 * priority always has a valid enum value and therefore don't
Packit 209cc3
	 * assume that we'll always go through one of the case arms.
Packit 209cc3
	 *
Packit 209cc3
	 * If we have a default case, compilers that *do* assume that
Packit 209cc3
	 * will then complain about the default case code being
Packit 209cc3
	 * unreachable.
Packit 209cc3
	 *
Packit 209cc3
	 * Damned if you do, damned if you don't.
Packit 209cc3
	 */
Packit 209cc3
	tag = "";
Packit 209cc3
Packit 209cc3
	switch (priority) {
Packit 209cc3
Packit 209cc3
	case LOGPRIO_DEBUG:
Packit 209cc3
		tag = "DEBUG: ";
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_INFO:
Packit 209cc3
		tag = "";
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_WARNING:
Packit 209cc3
		tag = "warning: ";
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_ERROR:
Packit 209cc3
		tag = "error: ";
Packit 209cc3
		break;
Packit 209cc3
	}
Packit 209cc3
Packit 209cc3
	fprintf(stderr, "rpcapd: %s", tag);
Packit 209cc3
	vfprintf(stderr, message, ap);
Packit 209cc3
	putc('\n', stderr);
Packit 209cc3
}
Packit 209cc3
Packit 209cc3
static void rpcapd_vlog_systemlog(log_priority,
Packit 209cc3
    PCAP_FORMAT_STRING(const char *), va_list) PCAP_PRINTFLIKE(2, 0);
Packit 209cc3
Packit 209cc3
#ifdef _WIN32
Packit 209cc3
#define MESSAGE_SUBKEY \
Packit 209cc3
    "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\rpcapd"
Packit 209cc3
Packit 209cc3
static void rpcapd_vlog_systemlog(log_priority priority, const char *message,
Packit 209cc3
    va_list ap)
Packit 209cc3
{
Packit 209cc3
#if 0
Packit 209cc3
	static int initialized = 0;
Packit 209cc3
	HKEY hey_handle;
Packit 209cc3
	static HANDLE log_handle;
Packit 209cc3
	WORD eventlog_type;
Packit 209cc3
	DWORD event_id;
Packit 209cc3
	char msgbuf[1024];
Packit 209cc3
	char *strings[1];
Packit 209cc3
Packit 209cc3
	if (!initialized) {
Packit 209cc3
		/*
Packit 209cc3
		 * Register our message stuff in the Registry.
Packit 209cc3
		 *
Packit 209cc3
		 * First, create the registry key for us.  If the key
Packit 209cc3
		 * already exists, this succeeds and returns a handle
Packit 209cc3
		 * for it.
Packit 209cc3
		 */
Packit 209cc3
		if (RegCreateKey(HKEY_LOCAL_MACHINE, MESSAGE_SUBKEY,
Packit 209cc3
		    &key_handle) != ERROR_SUCCESS) {
Packit 209cc3
			/*
Packit 209cc3
			 * Failed - give up and just log this message,
Packit 209cc3
			 * and all subsequent messages, to the
Packit 209cc3
			 * standard error.
Packit 209cc3
			 */
Packit 209cc3
			log_to_systemlog = 0;
Packit 209cc3
			initialized = 1;
Packit 209cc3
			rpcapd_vlog_stderr(priority, message, ap);
Packit 209cc3
			return;
Packit 209cc3
		}
Packit 209cc3
		log_handle = RegisterEventSource(NULL, "rpcapd");
Packit 209cc3
		initialized = 1;
Packit 209cc3
	}
Packit 209cc3
Packit 209cc3
	switch (priority) {
Packit 209cc3
Packit 209cc3
	case LOGPRIO_DEBUG:
Packit 209cc3
		//
Packit 209cc3
		// XXX - what *should* we do about debug messages?
Packit 209cc3
		//
Packit 209cc3
		eventlog_type = EVENTLOG_INFORMATION_TYPE;
Packit 209cc3
		event_id = RPCAPD_INFO_ID;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_INFO:
Packit 209cc3
		eventlog_type = EVENTLOG_INFORMATION_TYPE;
Packit 209cc3
		event_id = RPCAPD_INFO_ID;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_WARNING:
Packit 209cc3
		eventlog_type = EVENTLOG_WARNING_TYPE;
Packit 209cc3
		event_id = RPCAPD_WARNING_ID;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_ERROR:
Packit 209cc3
		eventlog_type = EVENTLOG_ERROR_TYPE;
Packit 209cc3
		event_id = RPCAPD_ERROR_ID;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	default:
Packit 209cc3
		/* Don't do this. */
Packit 209cc3
		return;
Packit 209cc3
	}
Packit 209cc3
Packit 209cc3
	vsprintf(msgbuf, message, ap);
Packit 209cc3
Packit 209cc3
	strings[0] = msgbuf;
Packit 209cc3
	/*
Packit 209cc3
	 * If this fails, how are we going to report it?
Packit 209cc3
	 */
Packit 209cc3
	(void) ReportEvent(log_handle, eventlog_type, 0, event_id, NULL, 1, 0,
Packit 209cc3
	    strings, NULL);
Packit 209cc3
#else
Packit 209cc3
	rpcapd_vlog_stderr(priority, message, ap);
Packit 209cc3
#endif
Packit 209cc3
}
Packit 209cc3
#else
Packit 209cc3
static void rpcapd_vlog_systemlog(log_priority priority, const char *message,
Packit 209cc3
    va_list ap)
Packit 209cc3
{
Packit 209cc3
	static int initialized = 0;
Packit 209cc3
	int syslog_priority;
Packit 209cc3
Packit 209cc3
	if (!initialized) {
Packit 209cc3
		//
Packit 209cc3
		// Open the log.
Packit 209cc3
		//
Packit 209cc3
		openlog("rpcapd", LOG_PID, LOG_DAEMON);
Packit 209cc3
		initialized = 1;
Packit 209cc3
	}
Packit 209cc3
Packit 209cc3
	switch (priority) {
Packit 209cc3
Packit 209cc3
	case LOGPRIO_DEBUG:
Packit 209cc3
		syslog_priority = LOG_DEBUG;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_INFO:
Packit 209cc3
		syslog_priority = LOG_INFO;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_WARNING:
Packit 209cc3
		syslog_priority = LOG_WARNING;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	case LOGPRIO_ERROR:
Packit 209cc3
		syslog_priority = LOG_ERR;
Packit 209cc3
		break;
Packit 209cc3
Packit 209cc3
	default:
Packit 209cc3
		/* Don't do this. */
Packit 209cc3
		return;
Packit 209cc3
	}
Packit 209cc3
Packit 209cc3
#ifdef HAVE_VSYSLOG
Packit 209cc3
	vsyslog(syslog_priority, message, ap);
Packit 209cc3
#else
Packit 209cc3
	/*
Packit 209cc3
	 * Thanks, IBM, for not providing vsyslog() in AIX!
Packit 209cc3
	 *
Packit 209cc3
	 * They also warn that the syslog functions shouldn't
Packit 209cc3
	 * be used in multithreaded programs, but the only thing
Packit 209cc3
	 * obvious that seems to make the syslog_r functions
Packit 209cc3
	 * better is that they have an additional argument
Packit 209cc3
	 * that points to the information that's static to
Packit 209cc3
	 * the syslog code in non-thread-safe versions.  Most
Packit 209cc3
	 * of that data is set by openlog(); since we already
Packit 209cc3
	 * do an openlog before doing logging, and don't
Packit 209cc3
	 * change that data afterwards, I suspect that, in
Packit 209cc3
	 * practice, the regular syslog routines are OK for
Packit 209cc3
	 * us (especially given that we'd end up having one
Packit 209cc3
	 * static struct syslog_data anyway, which means we'd
Packit 209cc3
	 * just be like the non-thread-safe version).
Packit 209cc3
	 */
Packit 209cc3
	char logbuf[1024+1];
Packit 209cc3
Packit 209cc3
	pcap_vsnprintf(logbuf, sizeof logbuf, message, ap);
Packit 209cc3
	syslog(syslog_priority, "%s", logbuf);
Packit 209cc3
#endif
Packit 209cc3
}
Packit 209cc3
#endif
Packit 209cc3
Packit 209cc3
void rpcapd_log_set(int log_to_systemlog_arg, int log_debug_messages_arg)
Packit 209cc3
{
Packit 209cc3
	log_debug_messages = log_debug_messages_arg;
Packit 209cc3
	log_to_systemlog = log_to_systemlog_arg;
Packit 209cc3
}
Packit 209cc3
Packit 209cc3
void rpcapd_log(log_priority priority, const char *message, ...)
Packit 209cc3
{
Packit 209cc3
	va_list ap;
Packit 209cc3
Packit 209cc3
	if (priority != LOGPRIO_DEBUG || log_debug_messages) {
Packit 209cc3
		va_start(ap, message);
Packit 209cc3
		if (log_to_systemlog)
Packit 209cc3
		{
Packit 209cc3
			rpcapd_vlog_systemlog(priority, message, ap);
Packit 209cc3
		}
Packit 209cc3
		else
Packit 209cc3
		{
Packit 209cc3
			rpcapd_vlog_stderr(priority, message, ap);
Packit 209cc3
		}
Packit 209cc3
		va_end(ap);
Packit 209cc3
	}
Packit 209cc3
}