xref: /netbsd-src/external/bsd/ipf/dist/lib/save_syslog.c (revision bc4097aacfdd9307c19b7947c13c6ad6982527a9)
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 *
syslog_parse(char ** strings)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
syslog_print(ctx)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
syslog_destroy(ctx)111 syslog_destroy(ctx)
112 	void *ctx;
113 {
114 	free(ctx);
115 }
116 
117 
118 static int
syslog_send(ctx,msg)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