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