save_syslog.c revision 256281
137904Sjlemon#include "ipf.h" 237904Sjlemon#include "ipmon.h" 337904Sjlemon#include <syslog.h> 437904Sjlemon 537904Sjlemonstatic void *syslog_parse __P((char **)); 637904Sjlemonstatic void syslog_destroy __P((void *)); 737904Sjlemonstatic int syslog_send __P((void *, ipmon_msg_t *)); 837904Sjlemonstatic void syslog_print __P((void *)); 937904Sjlemon 1037904Sjlemontypedef struct syslog_opts_s { 1137904Sjlemon int facpri; 1237904Sjlemon int fac; 1337904Sjlemon int pri; 1437904Sjlemon} syslog_opts_t; 1537904Sjlemon 1637904Sjlemonipmon_saver_t syslogsaver = { 1737904Sjlemon "syslog", 1837904Sjlemon syslog_destroy, 1937904Sjlemon NULL, /* dup */ 2037904Sjlemon NULL, /* match */ 2137904Sjlemon syslog_parse, 2237904Sjlemon syslog_print, 2337904Sjlemon syslog_send 2437904Sjlemon}; 2537904Sjlemon 2637904Sjlemon 2737904Sjlemonstatic void * 2837904Sjlemonsyslog_parse(char **strings) 2937904Sjlemon{ 3037904Sjlemon syslog_opts_t *ctx; 3137904Sjlemon char *str; 3237904Sjlemon char *s; 3337904Sjlemon 3437904Sjlemon ctx = calloc(1, sizeof(*ctx)); 3537904Sjlemon if (ctx == NULL) 3637904Sjlemon return NULL; 3737904Sjlemon 3837904Sjlemon ctx->facpri = -1; 3937904Sjlemon 4037904Sjlemon if (strings[0] != NULL && strings[0][0] != '\0') { 4137904Sjlemon str = strdup(*strings); 4237904Sjlemon if (str != NULL && *str != '\0') { 4337904Sjlemon int fac = -1, pri = -1; 4437904Sjlemon 4537904Sjlemon s = strchr(str, '.'); 4637904Sjlemon if (s != NULL) 4737904Sjlemon *s++ = '\0'; 4837904Sjlemon 4937904Sjlemon if (*str != '\0') { 50 fac = fac_findname(str); 51 if (fac == -1) { 52 free(str); 53 free(ctx); 54 return NULL; 55 } 56 } 57 58 if (s != NULL && *s != '\0') { 59 pri = pri_findname(s); 60 if (pri == -1) { 61 free(str); 62 free(ctx); 63 return NULL; 64 } 65 } 66 free(str); 67 68 ctx->fac = fac; 69 ctx->pri = pri; 70 if (pri == -1) 71 ctx->facpri = fac; 72 else if (fac == -1) 73 ctx->facpri = pri; 74 else 75 ctx->facpri = fac | pri; 76 } else { 77 if (str != NULL) 78 free(str); 79 free(ctx); 80 ctx = NULL; 81 } 82 } 83 84 return ctx; 85} 86 87 88static void 89syslog_print(ctx) 90 void *ctx; 91{ 92 syslog_opts_t *sys = ctx; 93 94 if (sys->facpri == -1) 95 return; 96 97 if (sys->fac == -1) { 98 printf(".%s", pri_toname(sys->pri)); 99 } else if (sys->pri == -1) { 100 printf("%s.", fac_toname(sys->fac)); 101 } else { 102 printf("%s.%s", fac_toname(sys->facpri & LOG_FACMASK), 103 pri_toname(sys->facpri & LOG_PRIMASK)); 104 } 105} 106 107 108static void 109syslog_destroy(ctx) 110 void *ctx; 111{ 112 free(ctx); 113} 114 115 116static int 117syslog_send(ctx, msg) 118 void *ctx; 119 ipmon_msg_t *msg; 120{ 121 syslog_opts_t *sys = ctx; 122 int facpri; 123 124 if (sys->facpri == -1) { 125 facpri = msg->imm_loglevel; 126 } else { 127 if (sys->pri == -1) { 128 facpri = sys->fac | (msg->imm_loglevel & LOG_PRIMASK); 129 } else if (sys->fac == -1) { 130 facpri = sys->pri | (msg->imm_loglevel & LOG_FACMASK); 131 } else { 132 facpri = sys->facpri; 133 } 134 } 135 syslog(facpri, "%s", msg->imm_msg); 136 return 0; 137} 138