| #include "ipf.h" |
| #include "ipmon.h" |
| #include <syslog.h> |
| |
| 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; |
| } |