#include "ipf.h" #include "ipmon.h" #include static void *syslog_parse __P((char **)); static void syslog_destroy __P((void *)); static int syslog_send __P((void *, ipmon_msg_t *)); static void syslog_print __P((void *)); typedef struct syslog_opts_s { int facpri; int fac; int pri; } syslog_opts_t; ipmon_saver_t syslogsaver = { "syslog", syslog_destroy, NULL, /* dup */ NULL, /* match */ syslog_parse, syslog_print, syslog_send }; static void * syslog_parse(char **strings) { syslog_opts_t *ctx; char *str; char *s; ctx = calloc(1, sizeof(*ctx)); if (ctx == NULL) return NULL; ctx->facpri = -1; if (strings[0] != NULL && strings[0][0] != '\0') { str = strdup(*strings); if (str != NULL && *str != '\0') { int fac = -1, pri = -1; s = strchr(str, '.'); if (s != NULL) *s++ = '\0'; if (*str != '\0') { fac = fac_findname(str); if (fac == -1) { free(str); free(ctx); return NULL; } } if (s != NULL && *s != '\0') { pri = pri_findname(s); if (pri == -1) { free(str); free(ctx); return NULL; } } free(str); ctx->fac = fac; ctx->pri = pri; if (pri == -1) ctx->facpri = fac; else if (fac == -1) ctx->facpri = pri; else ctx->facpri = fac | pri; } else { if (str != NULL) free(str); free(ctx); ctx = NULL; } } return ctx; } static void syslog_print(ctx) void *ctx; { syslog_opts_t *sys = ctx; if (sys->facpri == -1) return; if (sys->fac == -1) { printf(".%s", pri_toname(sys->pri)); } else if (sys->pri == -1) { printf("%s.", fac_toname(sys->fac)); } else { printf("%s.%s", fac_toname(sys->facpri & LOG_FACMASK), pri_toname(sys->facpri & LOG_PRIMASK)); } } static void syslog_destroy(ctx) void *ctx; { free(ctx); } static int syslog_send(ctx, msg) void *ctx; ipmon_msg_t *msg; { syslog_opts_t *sys = ctx; int facpri; if (sys->facpri == -1) { facpri = msg->imm_loglevel; } else { if (sys->pri == -1) { facpri = sys->fac | (msg->imm_loglevel & LOG_PRIMASK); } else if (sys->fac == -1) { facpri = sys->pri | (msg->imm_loglevel & LOG_FACMASK); } else { facpri = sys->facpri; } } syslog(facpri, "%s", msg->imm_msg); return 0; }