diff options
author | 2016-01-28 09:03:35 +0000 | |
---|---|---|
committer | 2016-01-28 09:03:35 +0000 | |
commit | 10fa39d4bc6d268bc4fbef5b17d0f6cb296760f4 (patch) | |
tree | c27abd89bcdffd6673c3e39529451e4be0a648d4 | |
parent | more tweaks; ok krw (diff) | |
download | wireguard-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.c | 184 |
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) { |