|
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 |
}
|