HardenedBSD/sbin/ipf/libipf/save_syslog.c
Cy Schubert 44bc301921 ipfilter userland: Style(9) requires a space after return
Reported by:    jrtc27
Fixes:          2582ae5740
MFC after:      1 month
2022-01-03 19:37:25 -08:00

134 lines
2.2 KiB
C

#include "ipf.h"
#include "ipmon.h"
#include <syslog.h>
static void *syslog_parse(char **);
static void syslog_destroy(void *);
static int syslog_send(void *, ipmon_msg_t *);
static void syslog_print(void *);
typedef struct syslog_opts_s {
int facpri;
int fac;
int pri;
} syslog_opts_t;
ipmon_saver_t syslogsaver = {
"syslog",
syslog_destroy,
NULL, /* dup */
NULL, /* match */
syslog_parse,
syslog_print,
syslog_send
};
static void *
syslog_parse(char **strings)
{
syslog_opts_t *ctx;
char *str;
char *s;
ctx = calloc(1, sizeof(*ctx));
if (ctx == NULL)
return (NULL);
ctx->facpri = -1;
if (strings[0] != NULL && strings[0][0] != '\0') {
str = strdup(*strings);
if (str != NULL && *str != '\0') {
int fac = -1, pri = -1;
s = strchr(str, '.');
if (s != NULL)
*s++ = '\0';
if (*str != '\0') {
fac = fac_findname(str);
if (fac == -1) {
free(str);
free(ctx);
return (NULL);
}
}
if (s != NULL && *s != '\0') {
pri = pri_findname(s);
if (pri == -1) {
free(str);
free(ctx);
return (NULL);
}
}
free(str);
ctx->fac = fac;
ctx->pri = pri;
if (pri == -1)
ctx->facpri = fac;
else if (fac == -1)
ctx->facpri = pri;
else
ctx->facpri = fac | pri;
} else {
if (str != NULL)
free(str);
free(ctx);
ctx = NULL;
}
}
return (ctx);
}
static void
syslog_print(void *ctx)
{
syslog_opts_t *sys = ctx;
if (sys->facpri == -1)
return;
if (sys->fac == -1) {
printf(".%s", pri_toname(sys->pri));
} else if (sys->pri == -1) {
printf("%s.", fac_toname(sys->fac));
} else {
printf("%s.%s", fac_toname(sys->facpri & LOG_FACMASK),
pri_toname(sys->facpri & LOG_PRIMASK));
}
}
static void
syslog_destroy(void *ctx)
{
free(ctx);
}
static int
syslog_send(void *ctx, ipmon_msg_t *msg)
{
syslog_opts_t *sys = ctx;
int facpri;
if (sys->facpri == -1) {
facpri = msg->imm_loglevel;
} else {
if (sys->pri == -1) {
facpri = sys->fac | (msg->imm_loglevel & LOG_PRIMASK);
} else if (sys->fac == -1) {
facpri = sys->pri | (msg->imm_loglevel & LOG_FACMASK);
} else {
facpri = sys->facpri;
}
}
syslog(facpri, "%s", msg->imm_msg);
return (0);
}