diff options
author | 2011-11-15 23:22:47 +0000 | |
---|---|---|
committer | 2011-11-15 23:22:47 +0000 | |
commit | 1d6850005c960b3d3d24ef08cdc6afcda2dedbe5 (patch) | |
tree | a887e329800c7bdef8b16c8d94054e9358a2016d | |
parent | Add a pane_index format string and use it, from Ben Boeckel. (diff) | |
download | wireguard-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.c | 53 | ||||
-rw-r--r-- | usr.sbin/smtpd/filter.h | 20 | ||||
-rw-r--r-- | usr.sbin/smtpd/filter_api.c | 21 | ||||
-rw-r--r-- | usr.sbin/smtpd/libsmtpdfilter/Makefile | 16 |
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> |