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