blob: 6fdbc7427f40d60fbec5106a4b6becc37b64fd22 [file] [log] [blame]
/* logging.c - generic logging for snmp-agent
* Contributed by Ragnar Kjørstad, ucd@ragnark.vestdata.no 1999-06-26 */
#include "config.h"
#if HAVE_SYSLOG_H
#include <syslog.h>
#endif
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#ifdef STDC_HEADERS
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include "snmp_logging.h"
int do_syslogging=0;
int do_filelogging=0;
int do_stderrlogging=0;
FILE *logfile;
void
disable_syslog(void) {
if (do_syslogging)
#ifndef WIN32
closelog();
#endif
do_syslogging=0;
}
void
disable_filelog(void) {
if (do_filelogging)
fclose(logfile);
do_filelogging=0;
}
void
disable_stderrlog(void) {
do_stderrlogging=0;
}
void
disable_log(void) {
disable_syslog();
disable_filelog();
disable_stderrlog();
}
void
enable_syslog(void)
{
disable_syslog();
#ifndef WIN32
openlog("ucd-snmp", LOG_CONS|LOG_PID, LOG_DAEMON);
do_syslogging=1;
#endif
}
void
enable_filelog(const char *logfilename, int dont_zero_log)
{
disable_filelog();
logfile=fopen(logfilename, dont_zero_log ? "a" : "w");
if (logfile)
do_filelogging=1;
else
do_filelogging=0;
}
void
enable_stderrlog(void) {
do_stderrlogging=1;
}
void
vlog_syslog (int priority, const char *format, va_list ap)
{
if (do_syslogging) {
#ifndef WIN32
syslog(priority, format, ap);
#endif
}
}
void
#ifdef STDC_HEADERS
log_syslog (int priority, const char *format, ...)
#else
log_syslog (int priority, va_alist)
va_dcl
#endif
{
va_list ap;
#ifdef STDC_HEADERS
va_start(ap, format);
#else
const char *format;
va_start(ap);
format = va_arg(ap, const char *);
#endif
vlog_syslog(priority, format, ap);
va_end(ap);
}
void
vlog_toFILE(FILE *file, int priority, const char *format, va_list ap)
{
/* fprintf(file, "log: %d: ", priority); */
/* vfprintf(file, format[0]=='\n'?format+1:format, ap); */
vfprintf(file, format, ap);
/* Making sure error-message ends with a newline:
if (format[strlen(format)-1]!='\n')
fprintf(file, "\n"); */
}
void
vlog_filelog (int priority, const char *format, va_list ap)
{
if (do_filelogging) {
vlog_toFILE(logfile, priority, format, ap);
}
}
void
#ifdef STDC_HEADERS
log_filelog (int priority, const char *format, ...)
#else
log_filelog (int priority, va_alist)
va_dcl
#endif
{
va_list ap;
#ifdef STDC_HEADERS
va_start(ap, format);
#else
const char *format;
va_start(ap);
format = va_arg(ap, const char *);
#endif
vlog_filelog(priority, format, ap);
va_end(ap);
}
void
vlog_stderrlog (int priority, const char *format, va_list ap)
{
if (do_stderrlogging) {
vlog_toFILE(stderr, priority, format, ap);
}
}
void
#ifdef STDC_HEADERS
log_stderrlog (int priority, const char *format, ...)
#else
log_stderrlog (int priority, va_alist)
va_dcl
#endif
{
va_list ap;
#ifdef STDC_HEADERS
va_start(ap, format);
#else
const char *format;
va_start(ap);
format = va_arg(ap, const char *);
#endif
vlog_stderrlog(priority, format, ap);
va_end(ap);
}
void
vlog (int priority, const char *format, va_list ap)
{
vlog_syslog(priority, format, ap);
vlog_filelog(priority, format, ap);
vlog_stderrlog(priority, format, ap);
}
void
#ifdef STDC_HEADERS
snmp_log (int priority, const char *format, ...)
#else
snmp_log (int priority, va_alist)
va_dcl
#endif
{
va_list ap;
#ifdef STDC_HEADERS
va_start(ap, format);
#else
const char *format;
va_start(ap);
format = va_arg(ap, const char *);
#endif
vlog(priority, format, ap);
va_end(ap);
}
void
log_perror_syslog(const char *s)
{
log_syslog(LOG_ERR, "System error - check logfile (if any) for details");
}
void
log_perror_filelog(const char *s)
{
log_filelog(LOG_ERR, "System error - detail error reporting not implemented");
}
void
log_perror_stderrlog(const char *s)
{
log_stderrlog(LOG_ERR, "System error: ");
perror(s);
}
void
log_perror(const char *s)
{
log_perror_syslog(s);
log_perror_filelog(s);
log_perror_stderrlog(s);
}