summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgilles <gilles@openbsd.org>2011-11-15 23:22:47 +0000
committergilles <gilles@openbsd.org>2011-11-15 23:22:47 +0000
commit1d6850005c960b3d3d24ef08cdc6afcda2dedbe5 (patch)
treea887e329800c7bdef8b16c8d94054e9358a2016d
parentAdd a pane_index format string and use it, from Ben Boeckel. (diff)
downloadwireguard-openbsd-1d6850005c960b3d3d24ef08cdc6afcda2dedbe5.tar.xz
wireguard-openbsd-1d6850005c960b3d3d24ef08cdc6afcda2dedbe5.zip
- change callback prototypes in filter.c to allow stricter checks
- introduce STATUS_WAITING, filters will reroute async DNS queries through LKA in a near future - filter_api.c will contain our filter API (empty for now) - Makefile to build libsmtpdfilter (not linked to the build,dev stuff only)
-rw-r--r--usr.sbin/smtpd/filter.c53
-rw-r--r--usr.sbin/smtpd/filter.h20
-rw-r--r--usr.sbin/smtpd/filter_api.c21
-rw-r--r--usr.sbin/smtpd/libsmtpdfilter/Makefile16
4 files changed, 82 insertions, 28 deletions
diff --git a/usr.sbin/smtpd/filter.c b/usr.sbin/smtpd/filter.c
index 59ca75b47e7..1f11b6c3f8d 100644
--- a/usr.sbin/smtpd/filter.c
+++ b/usr.sbin/smtpd/filter.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: filter.c,v 1.2 2011/08/31 18:56:30 gilles Exp $ */
+/* $OpenBSD: filter.c,v 1.3 2011/11/15 23:22:47 gilles Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org>
@@ -35,19 +35,19 @@ static struct filter_internals {
struct event ev;
struct imsgbuf ibuf;
- int (*helo_cb)(u_int64_t, struct filter_helo *, void *);
+ enum filter_status (*helo_cb)(u_int64_t, struct filter_helo *, void *);
void *helo_cb_arg;
- int (*ehlo_cb)(u_int64_t, struct filter_helo *, void *);
+ enum filter_status (*ehlo_cb)(u_int64_t, struct filter_helo *, void *);
void *ehlo_cb_arg;
- int (*mail_cb)(u_int64_t, struct filter_mail *, void *);
+ enum filter_status (*mail_cb)(u_int64_t, struct filter_mail *, void *);
void *mail_cb_arg;
- int (*rcpt_cb)(u_int64_t, struct filter_rcpt *, void *);
+ enum filter_status (*rcpt_cb)(u_int64_t, struct filter_rcpt *, void *);
void *rcpt_cb_arg;
- int (*dataline_cb)(u_int64_t, struct filter_dataline *, void *);
+ enum filter_status (*dataline_cb)(u_int64_t, struct filter_dataline *, void *);
void *dataline_cb_arg;
} fi;
@@ -74,31 +74,31 @@ filter_loop(void)
}
void
-filter_register_helo_callback(int (*cb)(u_int64_t, struct filter_helo *, void *), void *cb_arg)
+filter_register_helo_callback(enum filter_status (*cb)(u_int64_t, struct filter_helo *, void *), void *cb_arg)
{
filter_register_callback(FILTER_HELO, cb, cb_arg);
}
void
-filter_register_ehlo_callback(int (*cb)(u_int64_t, struct filter_helo *, void *), void *cb_arg)
+filter_register_ehlo_callback(enum filter_status (*cb)(u_int64_t, struct filter_helo *, void *), void *cb_arg)
{
filter_register_callback(FILTER_EHLO, cb, cb_arg);
}
void
-filter_register_mail_callback(int (*cb)(u_int64_t, struct filter_mail *, void *), void *cb_arg)
+filter_register_mail_callback(enum filter_status (*cb)(u_int64_t, struct filter_mail *, void *), void *cb_arg)
{
filter_register_callback(FILTER_MAIL, cb, cb_arg);
}
void
-filter_register_rcpt_callback(int (*cb)(u_int64_t, struct filter_rcpt *, void *), void *cb_arg)
+filter_register_rcpt_callback(enum filter_status (*cb)(u_int64_t, struct filter_rcpt *, void *), void *cb_arg)
{
filter_register_callback(FILTER_RCPT, cb, cb_arg);
}
void
-filter_register_dataline_callback(int (*cb)(u_int64_t, struct filter_dataline *, void *), void *cb_arg)
+filter_register_dataline_callback(enum filter_status (*cb)(u_int64_t, struct filter_dataline *, void *), void *cb_arg)
{
filter_register_callback(FILTER_DATALINE, cb, cb_arg);
}
@@ -140,6 +140,7 @@ filter_handler(int fd, short event, void *p)
struct imsg imsg;
ssize_t n;
short evflags = EV_READ;
+ enum filter_status ret;
struct filter_msg fm;
if (event & EV_READ) {
@@ -179,42 +180,52 @@ filter_handler(int fd, short event, void *p)
case FILTER_HELO:
if (fi.helo_cb == NULL)
goto ignore;
- fm.code = fi.helo_cb(fm.cl_id, &fm.u.helo,
+ ret = fi.helo_cb(fm.cl_id, &fm.u.helo,
fi.helo_cb_arg);
break;
case FILTER_EHLO:
if (fi.ehlo_cb == NULL)
goto ignore;
- fm.code = fi.ehlo_cb(fm.cl_id, &fm.u.helo,
+ ret = fi.ehlo_cb(fm.cl_id, &fm.u.helo,
fi.ehlo_cb_arg);
break;
case FILTER_MAIL:
if (fi.mail_cb == NULL)
goto ignore;
- fm.code = fi.mail_cb(fm.cl_id, &fm.u.mail,
+ ret = fi.mail_cb(fm.cl_id, &fm.u.mail,
fi.mail_cb_arg);
break;
case FILTER_RCPT:
if (fi.rcpt_cb == NULL)
goto ignore;
- fm.code = fi.rcpt_cb(fm.cl_id, &fm.u.rcpt,
+ ret = fi.rcpt_cb(fm.cl_id, &fm.u.rcpt,
fi.rcpt_cb_arg);
break;
case FILTER_DATALINE:
if (fi.dataline_cb == NULL)
goto ignore;
- fm.code = fi.dataline_cb(fm.cl_id, &fm.u.dataline,
+ ret = fi.dataline_cb(fm.cl_id, &fm.u.dataline,
fi.dataline_cb_arg);
break;
default:
errx(1, "unsupported imsg");
}
- if (! fm.code)
- fm.code = -1;
-
- imsg_compose(&fi.ibuf, imsg.hdr.type, 0, 0, -1, &fm, sizeof fm);
- evflags |= EV_WRITE;
+ switch (fm.code) {
+ case STATUS_ACCEPT:
+ case STATUS_REJECT:
+ fm.code = ret;
+ if (ret == STATUS_REJECT)
+ fm.code = -1;
+ imsg_compose(&fi.ibuf, imsg.hdr.type, 0, 0, -1, &fm,
+ sizeof fm);
+ evflags |= EV_WRITE;
+ break;
+ case STATUS_WAITING:
+ /* waiting for asynchronous call ... */
+ break;
+ }
+
imsg_free(&imsg);
}
diff --git a/usr.sbin/smtpd/filter.h b/usr.sbin/smtpd/filter.h
index 8ce989c319f..e445f4742b1 100644
--- a/usr.sbin/smtpd/filter.h
+++ b/usr.sbin/smtpd/filter.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: filter.h,v 1.3 2011/09/12 20:47:15 gilles Exp $ */
+/* $OpenBSD: filter.h,v 1.4 2011/11/15 23:22:47 gilles Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org>
@@ -31,6 +31,12 @@
#define MAX_DOMAINPART_SIZE (MAX_LINE_SIZE-MAX_LOCALPART_SIZE)
#endif
+enum filter_status {
+ STATUS_REJECT,
+ STATUS_ACCEPT,
+ STATUS_WAITING
+};
+
enum filter_type {
FILTER_HELO = 0x01,
FILTER_EHLO = 0x02,
@@ -67,7 +73,7 @@ union filter_union {
struct filter_msg {
u_int64_t id; /* set by smtpd(8) */
u_int64_t cl_id; /* set by smtpd(8) */
- int8_t code;
+ u_int8_t code;
u_int8_t version;
enum filter_type type;
union filter_union u;
@@ -77,8 +83,8 @@ struct filter_msg {
void filter_init(void);
void filter_loop(void);
-void filter_register_helo_callback(int (*)(u_int64_t, struct filter_helo *, void *), void *);
-void filter_register_ehlo_callback(int (*)(u_int64_t, struct filter_helo *, void *), void *);
-void filter_register_mail_callback(int (*)(u_int64_t, struct filter_mail *, void *), void *);
-void filter_register_rcpt_callback(int (*)(u_int64_t, struct filter_rcpt *, void *), void *);
-void filter_register_dataline_callback(int (*)(u_int64_t, struct filter_dataline *, void *), void *);
+void filter_register_helo_callback(enum filter_status (*)(u_int64_t, struct filter_helo *, void *), void *);
+void filter_register_ehlo_callback(enum filter_status (*)(u_int64_t, struct filter_helo *, void *), void *);
+void filter_register_mail_callback(enum filter_status (*)(u_int64_t, struct filter_mail *, void *), void *);
+void filter_register_rcpt_callback(enum filter_status (*)(u_int64_t, struct filter_rcpt *, void *), void *);
+void filter_register_dataline_callback(enum filter_status (*)(u_int64_t, struct filter_dataline *, void *), void *);
diff --git a/usr.sbin/smtpd/filter_api.c b/usr.sbin/smtpd/filter_api.c
new file mode 100644
index 00000000000..eb41d13ea1e
--- /dev/null
+++ b/usr.sbin/smtpd/filter_api.c
@@ -0,0 +1,21 @@
+/* $OpenBSD: filter_api.c,v 1.1 2011/11/15 23:22:47 gilles Exp $ */
+
+/*
+ * Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+
+#include "filter.h"
diff --git a/usr.sbin/smtpd/libsmtpdfilter/Makefile b/usr.sbin/smtpd/libsmtpdfilter/Makefile
new file mode 100644
index 00000000000..d90a68570ab
--- /dev/null
+++ b/usr.sbin/smtpd/libsmtpdfilter/Makefile
@@ -0,0 +1,16 @@
+# $OpenBSD: Makefile,v 1.1 2011/11/15 23:22:47 gilles Exp $
+
+.PATH: ${.CURDIR}/..
+
+LIB= smtpdfilter
+WANTLINT=no
+SRCS= filter.c filter_api.c
+DEBUGLIBS= no
+NOPROFILE= yes
+NOPIC= yes
+
+install:
+ @echo -n
+
+.include <bsd.own.mk>
+.include <bsd.lib.mk>