1 /* $NetBSD: save_syslog.c,v 1.1.1.1 2012/03/23 21:20:10 christos Exp $ */ 2 3 #include "ipf.h" 4 #include "ipmon.h" 5 #include <syslog.h> 6 7 static void *syslog_parse __P((char **)); 8 static void syslog_destroy __P((void *)); 9 static int syslog_send __P((void *, ipmon_msg_t *)); 10 static void syslog_print __P((void *)); 11 12 typedef struct syslog_opts_s { 13 int facpri; 14 int fac; 15 int pri; 16 } syslog_opts_t; 17 18 ipmon_saver_t syslogsaver = { 19 "syslog", 20 syslog_destroy, 21 NULL, /* dup */ 22 NULL, /* match */ 23 syslog_parse, 24 syslog_print, 25 syslog_send 26 }; 27 28 29 static void * 30 syslog_parse(char **strings) 31 { 32 syslog_opts_t *ctx; 33 char *str; 34 char *s; 35 36 ctx = calloc(1, sizeof(*ctx)); 37 if (ctx == NULL) 38 return NULL; 39 40 ctx->facpri = -1; 41 42 if (strings[0] != NULL && strings[0][0] != '\0') { 43 str = strdup(*strings); 44 if (str != NULL && *str != '\0') { 45 int fac = -1, pri = -1; 46 47 s = strchr(str, '.'); 48 if (s != NULL) 49 *s++ = '\0'; 50 51 if (*str != '\0') { 52 fac = fac_findname(str); 53 if (fac == -1) { 54 free(str); 55 free(ctx); 56 return NULL; 57 } 58 } 59 60 if (s != NULL && *s != '\0') { 61 pri = pri_findname(s); 62 if (pri == -1) { 63 free(str); 64 free(ctx); 65 return NULL; 66 } 67 } 68 free(str); 69 70 ctx->fac = fac; 71 ctx->pri = pri; 72 if (pri == -1) 73 ctx->facpri = fac; 74 else if (fac == -1) 75 ctx->facpri = pri; 76 else 77 ctx->facpri = fac | pri; 78 } else { 79 if (str != NULL) 80 free(str); 81 free(ctx); 82 ctx = NULL; 83 } 84 } 85 86 return ctx; 87 } 88 89 90 static void 91 syslog_print(ctx) 92 void *ctx; 93 { 94 syslog_opts_t *sys = ctx; 95 96 if (sys->facpri == -1) 97 return; 98 99 if (sys->fac == -1) { 100 printf(".%s", pri_toname(sys->pri)); 101 } else if (sys->pri == -1) { 102 printf("%s.", fac_toname(sys->fac)); 103 } else { 104 printf("%s.%s", fac_toname(sys->facpri & LOG_FACMASK), 105 pri_toname(sys->facpri & LOG_PRIMASK)); 106 } 107 } 108 109 110 static void 111 syslog_destroy(ctx) 112 void *ctx; 113 { 114 free(ctx); 115 } 116 117 118 static int 119 syslog_send(ctx, msg) 120 void *ctx; 121 ipmon_msg_t *msg; 122 { 123 syslog_opts_t *sys = ctx; 124 int facpri; 125 126 if (sys->facpri == -1) { 127 facpri = msg->imm_loglevel; 128 } else { 129 if (sys->pri == -1) { 130 facpri = sys->fac | (msg->imm_loglevel & LOG_PRIMASK); 131 } else if (sys->fac == -1) { 132 facpri = sys->pri | (msg->imm_loglevel & LOG_FACMASK); 133 } else { 134 facpri = sys->facpri; 135 } 136 } 137 syslog(facpri, "%s", msg->imm_msg); 138 return 0; 139 } 140