summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreric <eric@openbsd.org>2016-01-28 09:03:35 +0000
committereric <eric@openbsd.org>2016-01-28 09:03:35 +0000
commit10fa39d4bc6d268bc4fbef5b17d0f6cb296760f4 (patch)
treec27abd89bcdffd6673c3e39529451e4be0a648d4
parentmore tweaks; ok krw (diff)
downloadwireguard-openbsd-10fa39d4bc6d268bc4fbef5b17d0f6cb296760f4.tar.xz
wireguard-openbsd-10fa39d4bc6d268bc4fbef5b17d0f6cb296760f4.zip
Simplify the query-chain code now that events are sent through a dedicated loop.
ok gilles@ jung@
-rw-r--r--usr.sbin/smtpd/filter.c184
1 files changed, 66 insertions, 118 deletions
diff --git a/usr.sbin/smtpd/filter.c b/usr.sbin/smtpd/filter.c
index c907e037216..4e97923f6bb 100644
--- a/usr.sbin/smtpd/filter.c
+++ b/usr.sbin/smtpd/filter.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: filter.c,v 1.11 2016/01/27 08:36:35 eric Exp $ */
+/* $OpenBSD: filter.c,v 1.12 2016/01/28 09:03:35 eric Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@poolp.org>
@@ -42,11 +42,6 @@
#include "log.h"
enum {
- QK_QUERY,
- QK_EVENT,
-};
-
-enum {
QUERY_READY,
QUERY_WAITING,
QUERY_RUNNING,
@@ -88,7 +83,6 @@ struct filter_session {
struct filter_query {
uint64_t qid;
- int kind;
int type;
struct filter_session *session;
TAILQ_ENTRY(filter_query) entry;
@@ -119,7 +113,7 @@ struct filter_query {
static void filter_imsg(struct mproc *, struct imsg *);
static void filter_post_event(uint64_t, int, struct filter *, struct filter *);
-static struct filter_query *filter_query(struct filter_session *, int, int);
+static struct filter_query *filter_query(struct filter_session *, int);
static void filter_drain_query(struct filter_query *);
static void filter_run_query(struct filter *, struct filter_query *);
static void filter_end_query(struct filter_query *);
@@ -134,7 +128,6 @@ static const char * filter_session_to_text(struct filter_session *);
static const char * filter_query_to_text(struct filter_query *);
static const char * filter_to_text(struct filter *);
static const char * filter_proc_to_text(struct filter_proc *);
-static const char * kind_to_str(int);
static const char * query_to_str(int);
static const char * event_to_str(int);
static const char * status_to_str(int);
@@ -330,7 +323,7 @@ filter_connect(uint64_t id, const struct sockaddr *local,
tree_xset(&sessions, s->id, s);
filter_event(id, EVENT_CONNECT);
- q = filter_query(s, QK_QUERY, QUERY_CONNECT);
+ q = filter_query(s, QUERY_CONNECT);
memmove(&q->u.connect.local, local, local->sa_len);
memmove(&q->u.connect.remote, remote, remote->sa_len);
@@ -350,7 +343,7 @@ filter_mailaddr(uint64_t id, int type, const struct mailaddr *maddr)
struct filter_query *q;
s = tree_xget(&sessions, id);
- q = filter_query(s, QK_QUERY, type);
+ q = filter_query(s, type);
strlcpy(q->u.maddr.user, maddr->user, sizeof(q->u.maddr.user));
strlcpy(q->u.maddr.domain, maddr->domain, sizeof(q->u.maddr.domain));
@@ -365,7 +358,7 @@ filter_line(uint64_t id, int type, const char *line)
struct filter_query *q;
s = tree_xget(&sessions, id);
- q = filter_query(s, QK_QUERY, type);
+ q = filter_query(s, type);
if (line)
strlcpy(q->u.line, line, sizeof(q->u.line));
@@ -380,7 +373,7 @@ filter_eom(uint64_t id, int type, size_t datalen)
struct filter_query *q;
s = tree_xget(&sessions, id);
- q = filter_query(s, QK_QUERY, type);
+ q = filter_query(s, type);
q->u.datalen = datalen;
filter_drain_query(q);
@@ -436,14 +429,13 @@ filter_post_event(uint64_t id, int event, struct filter *f, struct filter *end)
}
static struct filter_query *
-filter_query(struct filter_session *s, int kind, int type)
+filter_query(struct filter_session *s, int type)
{
struct filter_query *q;
q = xcalloc(1, sizeof(*q), "filter_query");
q->qid = generate_uid();
q->session = s;
- q->kind = kind;
q->type = type;
TAILQ_INSERT_TAIL(&s->queries, q, entry);
@@ -451,12 +443,7 @@ filter_query(struct filter_session *s, int kind, int type)
q->current = TAILQ_FIRST(s->filters);
q->hasrun = 0;
- if (kind == QK_QUERY)
- log_trace(TRACE_FILTERS, "filter: new query %s %s",
- kind_to_str(kind), query_to_str(type));
- else
- log_trace(TRACE_FILTERS, "filter: new query %s %s",
- kind_to_str(kind), event_to_str(type));
+ log_trace(TRACE_FILTERS, "filter: new query %s", query_to_str(type));
return (q);
}
@@ -508,7 +495,7 @@ filter_drain_query(struct filter_query *q)
}
/* Defer the response if the file is not closed yet. */
- if (q->kind == QK_QUERY && q->type == QUERY_EOM && q->session->ofile) {
+ if (q->type == QUERY_EOM && q->session->ofile) {
log_debug("filter: deferring eom query...");
q->session->eom = q;
return;
@@ -520,53 +507,40 @@ filter_drain_query(struct filter_query *q)
static void
filter_run_query(struct filter *f, struct filter_query *q)
{
- if (q->kind == QK_QUERY) {
-
- log_trace(TRACE_FILTERS,
- "filter: running filter %s for query %s",
- filter_to_text(f), filter_query_to_text(q));
-
- m_create(&f->proc->mproc, IMSG_FILTER_QUERY, 0, 0, -1);
- m_add_id(&f->proc->mproc, q->session->id);
- m_add_id(&f->proc->mproc, q->qid);
- m_add_int(&f->proc->mproc, q->type);
-
- switch (q->type) {
- case QUERY_CONNECT:
- m_add_sockaddr(&f->proc->mproc,
- (struct sockaddr *)&q->u.connect.local);
- m_add_sockaddr(&f->proc->mproc,
- (struct sockaddr *)&q->u.connect.remote);
- m_add_string(&f->proc->mproc, q->u.connect.hostname);
- break;
- case QUERY_HELO:
- m_add_string(&f->proc->mproc, q->u.line);
- break;
- case QUERY_MAIL:
- case QUERY_RCPT:
- m_add_mailaddr(&f->proc->mproc, &q->u.maddr);
- break;
- case QUERY_EOM:
- m_add_u32(&f->proc->mproc, q->u.datalen);
- break;
- default:
- break;
- }
- m_close(&f->proc->mproc);
-
- tree_xset(&queries, q->qid, q);
- q->state = QUERY_RUNNING;
+ log_trace(TRACE_FILTERS,
+ "filter: running filter %s for query %s",
+ filter_to_text(f), filter_query_to_text(q));
+
+ m_create(&f->proc->mproc, IMSG_FILTER_QUERY, 0, 0, -1);
+ m_add_id(&f->proc->mproc, q->session->id);
+ m_add_id(&f->proc->mproc, q->qid);
+ m_add_int(&f->proc->mproc, q->type);
+
+ switch (q->type) {
+ case QUERY_CONNECT:
+ m_add_sockaddr(&f->proc->mproc,
+ (struct sockaddr *)&q->u.connect.local);
+ m_add_sockaddr(&f->proc->mproc,
+ (struct sockaddr *)&q->u.connect.remote);
+ m_add_string(&f->proc->mproc, q->u.connect.hostname);
+ break;
+ case QUERY_HELO:
+ m_add_string(&f->proc->mproc, q->u.line);
+ break;
+ case QUERY_MAIL:
+ case QUERY_RCPT:
+ m_add_mailaddr(&f->proc->mproc, &q->u.maddr);
+ break;
+ case QUERY_EOM:
+ m_add_u32(&f->proc->mproc, q->u.datalen);
+ break;
+ default:
+ break;
}
- else {
- log_trace(TRACE_FILTERS,
- "filter: running filter %s for query %s",
- filter_to_text(f), filter_query_to_text(q));
+ m_close(&f->proc->mproc);
- m_create(&f->proc->mproc, IMSG_FILTER_EVENT, 0, 0, -1);
- m_add_id(&f->proc->mproc, q->session->id);
- m_add_int(&f->proc->mproc, q->type);
- m_close(&f->proc->mproc);
- }
+ tree_xset(&queries, q->qid, q);
+ q->state = QUERY_RUNNING;
}
static void
@@ -577,9 +551,6 @@ filter_end_query(struct filter_query *q)
log_trace(TRACE_FILTERS, "filter: filter_end_query %s",
filter_query_to_text(q));
- if (q->kind == QK_EVENT)
- goto done;
-
if (q->type == QUERY_EOM) {
log_trace(TRACE_FILTERS,
@@ -615,11 +586,6 @@ filter_end_query(struct filter_query *q)
done:
TAILQ_REMOVE(&s->queries, q, entry);
- if (q->kind == QK_EVENT && q->type == EVENT_DISCONNECT) {
- io_clear(&s->iev);
- iobuf_clear(&s->ibuf);
- free(s);
- }
free(q);
}
@@ -823,39 +789,32 @@ filter_query_to_text(struct filter_query *q)
tmp[0] = '\0';
- if (q->kind == QK_QUERY) {
- switch (q->type) {
- case QUERY_CONNECT:
- strlcat(tmp, "=", sizeof tmp);
- strlcat(tmp, ss_to_text(&q->u.connect.local),
- sizeof tmp);
- strlcat(tmp, " <-> ", sizeof tmp);
- strlcat(tmp, ss_to_text(&q->u.connect.remote),
- sizeof tmp);
- strlcat(tmp, "(", sizeof tmp);
- strlcat(tmp, q->u.connect.hostname, sizeof tmp);
- strlcat(tmp, ")", sizeof tmp);
- break;
- case QUERY_MAIL:
- case QUERY_RCPT:
- snprintf(tmp, sizeof tmp, "=%s@%s",
- q->u.maddr.user, q->u.maddr.domain);
- break;
- case QUERY_HELO:
- snprintf(tmp, sizeof tmp, "=%s", q->u.line);
- break;
- default:
- break;
- }
- snprintf(buf, sizeof buf, "%016"PRIx64"[%s,%s%s,%s]",
- q->qid, kind_to_str(q->kind), query_to_str(q->type), tmp,
- filter_session_to_text(q->session));
- }
- else {
- snprintf(buf, sizeof buf, "%016"PRIx64"[%s,%s%s,%s]",
- q->qid, kind_to_str(q->kind), event_to_str(q->type), tmp,
- filter_session_to_text(q->session));
+ switch (q->type) {
+ case QUERY_CONNECT:
+ strlcat(tmp, "=", sizeof tmp);
+ strlcat(tmp, ss_to_text(&q->u.connect.local),
+ sizeof tmp);
+ strlcat(tmp, " <-> ", sizeof tmp);
+ strlcat(tmp, ss_to_text(&q->u.connect.remote),
+ sizeof tmp);
+ strlcat(tmp, "(", sizeof tmp);
+ strlcat(tmp, q->u.connect.hostname, sizeof tmp);
+ strlcat(tmp, ")", sizeof tmp);
+ break;
+ case QUERY_MAIL:
+ case QUERY_RCPT:
+ snprintf(tmp, sizeof tmp, "=%s@%s",
+ q->u.maddr.user, q->u.maddr.domain);
+ break;
+ case QUERY_HELO:
+ snprintf(tmp, sizeof tmp, "=%s", q->u.line);
+ break;
+ default:
+ break;
}
+ snprintf(buf, sizeof buf, "%016"PRIx64"[%s%s,%s]",
+ q->qid, query_to_str(q->type), tmp,
+ filter_session_to_text(q->session));
return (buf);
}
@@ -943,17 +902,6 @@ event_to_str(int event)
}
static const char *
-kind_to_str(int type)
-{
- switch (type) {
- CASE(QK_QUERY);
- CASE(QK_EVENT);
- default:
- return "QK_???";
- }
-}
-
-static const char *
status_to_str(int status)
{
switch (status) {