save_syslog.c revision 254219
1254219Scy#include "ipf.h" 2254219Scy#include "ipmon.h" 3254219Scy#include <syslog.h> 4254219Scy 5254219Scystatic void *syslog_parse __P((char **)); 6254219Scystatic void syslog_destroy __P((void *)); 7254219Scystatic int syslog_send __P((void *, ipmon_msg_t *)); 8254219Scystatic void syslog_print __P((void *)); 9254219Scy 10254219Scytypedef struct syslog_opts_s { 11254219Scy int facpri; 12254219Scy int fac; 13254219Scy int pri; 14254219Scy} syslog_opts_t; 15254219Scy 16254219Scyipmon_saver_t syslogsaver = { 17254219Scy "syslog", 18254219Scy syslog_destroy, 19254219Scy NULL, /* dup */ 20254219Scy NULL, /* match */ 21254219Scy syslog_parse, 22254219Scy syslog_print, 23254219Scy syslog_send 24254219Scy}; 25254219Scy 26254219Scy 27254219Scystatic void * 28254219Scysyslog_parse(char **strings) 29254219Scy{ 30254219Scy syslog_opts_t *ctx; 31254219Scy char *str; 32254219Scy char *s; 33254219Scy 34254219Scy ctx = calloc(1, sizeof(*ctx)); 35254219Scy if (ctx == NULL) 36254219Scy return NULL; 37254219Scy 38254219Scy ctx->facpri = -1; 39254219Scy 40254219Scy if (strings[0] != NULL && strings[0][0] != '\0') { 41254219Scy str = strdup(*strings); 42254219Scy if (str != NULL && *str != '\0') { 43254219Scy int fac = -1, pri = -1; 44254219Scy 45254219Scy s = strchr(str, '.'); 46254219Scy if (s != NULL) 47254219Scy *s++ = '\0'; 48254219Scy 49254219Scy if (*str != '\0') { 50254219Scy fac = fac_findname(str); 51254219Scy if (fac == -1) { 52254219Scy free(str); 53254219Scy free(ctx); 54254219Scy return NULL; 55254219Scy } 56254219Scy } 57254219Scy 58254219Scy if (s != NULL && *s != '\0') { 59254219Scy pri = pri_findname(s); 60254219Scy if (pri == -1) { 61254219Scy free(str); 62254219Scy free(ctx); 63254219Scy return NULL; 64254219Scy } 65254219Scy } 66254219Scy free(str); 67254219Scy 68254219Scy ctx->fac = fac; 69254219Scy ctx->pri = pri; 70254219Scy if (pri == -1) 71254219Scy ctx->facpri = fac; 72254219Scy else if (fac == -1) 73254219Scy ctx->facpri = pri; 74254219Scy else 75254219Scy ctx->facpri = fac | pri; 76254219Scy } else { 77254219Scy if (str != NULL) 78254219Scy free(str); 79254219Scy free(ctx); 80254219Scy ctx = NULL; 81254219Scy } 82254219Scy } 83254219Scy 84254219Scy return ctx; 85254219Scy} 86254219Scy 87254219Scy 88254219Scystatic void 89254219Scysyslog_print(ctx) 90254219Scy void *ctx; 91254219Scy{ 92254219Scy syslog_opts_t *sys = ctx; 93254219Scy 94254219Scy if (sys->facpri == -1) 95254219Scy return; 96254219Scy 97254219Scy if (sys->fac == -1) { 98254219Scy printf(".%s", pri_toname(sys->pri)); 99254219Scy } else if (sys->pri == -1) { 100254219Scy printf("%s.", fac_toname(sys->fac)); 101254219Scy } else { 102254219Scy printf("%s.%s", fac_toname(sys->facpri & LOG_FACMASK), 103254219Scy pri_toname(sys->facpri & LOG_PRIMASK)); 104254219Scy } 105254219Scy} 106254219Scy 107254219Scy 108254219Scystatic void 109254219Scysyslog_destroy(ctx) 110254219Scy void *ctx; 111254219Scy{ 112254219Scy free(ctx); 113254219Scy} 114254219Scy 115254219Scy 116254219Scystatic int 117254219Scysyslog_send(ctx, msg) 118254219Scy void *ctx; 119254219Scy ipmon_msg_t *msg; 120254219Scy{ 121254219Scy syslog_opts_t *sys = ctx; 122254219Scy int facpri; 123254219Scy 124254219Scy if (sys->facpri == -1) { 125254219Scy facpri = msg->imm_loglevel; 126254219Scy } else { 127254219Scy if (sys->pri == -1) { 128254219Scy facpri = sys->fac | (msg->imm_loglevel & LOG_PRIMASK); 129254219Scy } else if (sys->fac == -1) { 130254219Scy facpri = sys->pri | (msg->imm_loglevel & LOG_FACMASK); 131254219Scy } else { 132254219Scy facpri = sys->facpri; 133254219Scy } 134254219Scy } 135254219Scy syslog(facpri, "%s", msg->imm_msg); 136254219Scy return 0; 137254219Scy} 138