#include <sys_defs.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <syslog.h>
#include <string.h>
#include <time.h>
#include "vstring.h"
#include "stringops.h"
#include "msg.h"
#include "msg_output.h"
#include "msg_syslog.h"
#include "safe.h"
#define MSG_SYSLOG_RECLEN 2000
struct facility_list {
char *name;
int facility;
};
static struct facility_list facility_list[] = {
#ifdef LOG_AUTH
"auth", LOG_AUTH,
#endif
#ifdef LOG_AUTHPRIV
"authpriv", LOG_AUTHPRIV,
#endif
#ifdef LOG_CRON
"cron", LOG_CRON,
#endif
#ifdef LOG_DAEMON
"daemon", LOG_DAEMON,
#endif
#ifdef LOG_FTP
"ftp", LOG_FTP,
#endif
#ifdef LOG_KERN
"kern", LOG_KERN,
#endif
#ifdef LOG_LPR
"lpr", LOG_LPR,
#endif
#ifdef LOG_MAIL
"mail", LOG_MAIL,
#endif
#ifdef LOG_NEWS
"news", LOG_NEWS,
#endif
#ifdef LOG_SECURITY
"security", LOG_SECURITY,
#endif
#ifdef LOG_SYSLOG
"syslog", LOG_SYSLOG,
#endif
#ifdef LOG_USER
"user", LOG_USER,
#endif
#ifdef LOG_UUCP
"uucp", LOG_UUCP,
#endif
#ifdef LOG_LOCAL0
"local0", LOG_LOCAL0,
#endif
#ifdef LOG_LOCAL1
"local1", LOG_LOCAL1,
#endif
#ifdef LOG_LOCAL2
"local2", LOG_LOCAL2,
#endif
#ifdef LOG_LOCAL3
"local3", LOG_LOCAL3,
#endif
#ifdef LOG_LOCAL4
"local4", LOG_LOCAL4,
#endif
#ifdef LOG_LOCAL5
"local5", LOG_LOCAL5,
#endif
#ifdef LOG_LOCAL6
"local6", LOG_LOCAL6,
#endif
#ifdef LOG_LOCAL7
"local7", LOG_LOCAL7,
#endif
0,
};
static int syslog_facility;
static void msg_syslog_print(int level, const char *text)
{
static int log_level[] = {
LOG_INFO, LOG_WARNING, LOG_ERR, LOG_CRIT, LOG_CRIT,
};
static char *severity_name[] = {
"info", "warning", "error", "fatal", "panic",
};
if (level < 0 || level >= (int) (sizeof(log_level) / sizeof(log_level[0])))
msg_panic("msg_syslog_print: invalid severity level: %d", level);
if (level == MSG_INFO) {
syslog(syslog_facility | log_level[level], "%.*s",
(int) MSG_SYSLOG_RECLEN, text);
} else {
syslog(syslog_facility | log_level[level], "%s: %.*s",
severity_name[level], (int) MSG_SYSLOG_RECLEN, text);
}
}
void msg_syslog_init(const char *name, int logopt, int facility)
{
static int first_call = 1;
if (unsafe())
putenv("TZ=UTC");
tzset();
openlog(name, LOG_NDELAY | logopt, facility);
if (first_call) {
first_call = 0;
msg_output(msg_syslog_print);
}
}
int msg_syslog_facility(const char *facility_name)
{
struct facility_list *fnp;
for (fnp = facility_list; fnp->name; ++fnp) {
if (!strcmp(fnp->name, facility_name)) {
syslog_facility = fnp->facility;
return (1);
}
}
return 0;
}
#ifdef TEST
main(int argc, char **argv)
{
VSTRING *vp = vstring_alloc(256);
msg_syslog_init(argv[0], LOG_PID, LOG_MAIL);
if (argc < 2)
msg_error("usage: %s text to be logged", argv[0]);
while (--argc && *++argv) {
vstring_strcat(vp, *argv);
if (argv[1])
vstring_strcat(vp, " ");
}
msg_warn("static text");
msg_warn("dynamic text: >%s<", vstring_str(vp));
msg_warn("dynamic numeric: >%d<", 42);
msg_warn("error text: >%m<");
msg_warn("dynamic: >%s<: error: >%m<", vstring_str(vp));
vstring_free(vp);
return (0);
}
#endif