summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreric <eric@openbsd.org>2014-04-04 16:10:41 +0000
committereric <eric@openbsd.org>2014-04-04 16:10:41 +0000
commitaa1d5973d3dfd2f62aa2af3e94d0c8b82d0c1cfb (patch)
tree29658804ec99019911733177eb2c64c816355b50
parentRemember which names are in the NAME section. (diff)
downloadwireguard-openbsd-aa1d5973d3dfd2f62aa2af3e94d0c8b82d0c1cfb.tar.xz
wireguard-openbsd-aa1d5973d3dfd2f62aa2af3e94d0c8b82d0c1cfb.zip
Merge the mda, mta and smtp processes into a single unprivileged
process managing message reception, delivery and transfer. Mostly mechanical, but very intrusive as it required to rewamp all IMSG to fix ambiguities. with and ok gilles@
-rw-r--r--usr.sbin/smtpd/bounce.c24
-rw-r--r--usr.sbin/smtpd/config.c14
-rw-r--r--usr.sbin/smtpd/control.c64
-rw-r--r--usr.sbin/smtpd/dns.c66
-rw-r--r--usr.sbin/smtpd/enqueue.c4
-rw-r--r--usr.sbin/smtpd/lka.c87
-rw-r--r--usr.sbin/smtpd/lka_session.c22
-rw-r--r--usr.sbin/smtpd/mda.c182
-rw-r--r--usr.sbin/smtpd/mfa.c47
-rw-r--r--usr.sbin/smtpd/mfa_session.c22
-rw-r--r--usr.sbin/smtpd/mta.c191
-rw-r--r--usr.sbin/smtpd/mta_session.c59
-rw-r--r--usr.sbin/smtpd/pony.c222
-rw-r--r--usr.sbin/smtpd/queue.c195
-rw-r--r--usr.sbin/smtpd/scheduler.c34
-rw-r--r--usr.sbin/smtpd/smtp.c118
-rw-r--r--usr.sbin/smtpd/smtp_session.c103
-rw-r--r--usr.sbin/smtpd/smtpctl.c18
-rw-r--r--usr.sbin/smtpd/smtpd.c349
-rw-r--r--usr.sbin/smtpd/smtpd.h242
-rw-r--r--usr.sbin/smtpd/smtpd/Makefile4
21 files changed, 1016 insertions, 1051 deletions
diff --git a/usr.sbin/smtpd/bounce.c b/usr.sbin/smtpd/bounce.c
index d9decd60734..f074dffd35d 100644
--- a/usr.sbin/smtpd/bounce.c
+++ b/usr.sbin/smtpd/bounce.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bounce.c,v 1.62 2014/02/04 15:44:05 eric Exp $ */
+/* $OpenBSD: bounce.c,v 1.63 2014/04/04 16:10:41 eric Exp $ */
/*
* Copyright (c) 2009 Gilles Chehade <gilles@poolp.org>
@@ -130,7 +130,7 @@ bounce_add(uint64_t evpid)
bounce_init();
if (queue_envelope_load(evpid, &evp) == 0) {
- m_create(p_scheduler, IMSG_DELIVERY_PERMFAIL, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_DELIVERY_PERMFAIL, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_close(p_scheduler);
return;
@@ -266,7 +266,7 @@ bounce_drain()
}
log_debug("debug: bounce: requesting new enqueue socket...");
- m_compose(p_smtp, IMSG_SMTP_ENQUEUE_FD, 0, 0, -1, NULL, 0);
+ m_compose(p_pony, IMSG_QUEUE_SMTP_SESSION, 0, 0, -1, NULL, 0);
running += 1;
}
@@ -361,7 +361,7 @@ bounce_next_message(struct bounce_session *s)
SPLAY_REMOVE(bounce_message_tree, &messages, msg);
if ((fd = queue_message_fd_r(msg->msgid)) == -1) {
- bounce_delivery(msg, IMSG_DELIVERY_TEMPFAIL,
+ bounce_delivery(msg, IMSG_QUEUE_DELIVERY_TEMPFAIL,
"Could not open message fd");
goto again;
}
@@ -370,7 +370,7 @@ bounce_next_message(struct bounce_session *s)
snprintf(buf, sizeof(buf), "fdopen: %s", strerror(errno));
log_warn("warn: bounce: fdopen");
close(fd);
- bounce_delivery(msg, IMSG_DELIVERY_TEMPFAIL, buf);
+ bounce_delivery(msg, IMSG_QUEUE_DELIVERY_TEMPFAIL, buf);
goto again;
}
@@ -499,7 +499,7 @@ bounce_next(struct bounce_session *s)
if (ferror(s->msgfp)) {
fclose(s->msgfp);
s->msgfp = NULL;
- bounce_delivery(s->msg, IMSG_DELIVERY_TEMPFAIL,
+ bounce_delivery(s->msg, IMSG_QUEUE_DELIVERY_TEMPFAIL,
"Error reading message");
s->msg = NULL;
return (-1);
@@ -539,7 +539,7 @@ bounce_delivery(struct bounce_message *msg, int delivery, const char *status)
n = 0;
while ((be = TAILQ_FIRST(&msg->envelopes))) {
- if (delivery == IMSG_DELIVERY_TEMPFAIL) {
+ if (delivery == IMSG_QUEUE_DELIVERY_TEMPFAIL) {
if (queue_envelope_load(be->id, &evp) == 0) {
fatalx("could not reload envelope!");
}
@@ -563,9 +563,9 @@ bounce_delivery(struct bounce_message *msg, int delivery, const char *status)
}
- if (delivery == IMSG_DELIVERY_TEMPFAIL)
+ if (delivery == IMSG_QUEUE_DELIVERY_TEMPFAIL)
f = "TempFail";
- else if (delivery == IMSG_DELIVERY_PERMFAIL)
+ else if (delivery == IMSG_QUEUE_DELIVERY_PERMFAIL)
f = "PermFail";
else
f = NULL;
@@ -600,11 +600,11 @@ bounce_status(struct bounce_session *s, const char *fmt, ...)
va_end(ap);
if (*status == '2')
- delivery = IMSG_DELIVERY_OK;
+ delivery = IMSG_QUEUE_DELIVERY_OK;
else if (*status == '5' || *status == '6')
- delivery = IMSG_DELIVERY_PERMFAIL;
+ delivery = IMSG_QUEUE_DELIVERY_PERMFAIL;
else
- delivery = IMSG_DELIVERY_TEMPFAIL;
+ delivery = IMSG_QUEUE_DELIVERY_TEMPFAIL;
bounce_delivery(s->msg, delivery, status);
s->msg = NULL;
diff --git a/usr.sbin/smtpd/config.c b/usr.sbin/smtpd/config.c
index dfebab2f4b1..8657c6f1e20 100644
--- a/usr.sbin/smtpd/config.c
+++ b/usr.sbin/smtpd/config.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: config.c,v 1.25 2014/03/22 09:41:28 gilles Exp $ */
+/* $OpenBSD: config.c,v 1.26 2014/04/04 16:10:41 eric Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -135,20 +135,16 @@ config_peer(enum smtp_proc_type proc)
p_control = p;
else if (proc == PROC_LKA)
p_lka = p;
- else if (proc == PROC_MDA)
- p_mda = p;
else if (proc == PROC_MFA)
p_mfa = p;
- else if (proc == PROC_MTA)
- p_mta = p;
else if (proc == PROC_PARENT)
p_parent = p;
else if (proc == PROC_QUEUE)
p_queue = p;
else if (proc == PROC_SCHEDULER)
p_scheduler = p;
- else if (proc == PROC_SMTP)
- p_smtp = p;
+ else if (proc == PROC_PONY)
+ p_pony = p;
else
fatalx("bad peer");
}
@@ -209,13 +205,11 @@ process_stat_event(int fd, short ev, void *arg)
process_stat(p_control);
process_stat(p_lka);
- process_stat(p_mda);
process_stat(p_mfa);
- process_stat(p_mda);
process_stat(p_parent);
process_stat(p_queue);
process_stat(p_scheduler);
- process_stat(p_smtp);
+ process_stat(p_pony);
tv.tv_sec = 1;
tv.tv_usec = 0;
diff --git a/usr.sbin/smtpd/control.c b/usr.sbin/smtpd/control.c
index d3b97b43076..2f69c4f113a 100644
--- a/usr.sbin/smtpd/control.c
+++ b/usr.sbin/smtpd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.97 2014/02/17 13:33:56 eric Exp $ */
+/* $OpenBSD: control.c,v 1.98 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2012 Gilles Chehade <gilles@poolp.org>
@@ -85,9 +85,9 @@ control_imsg(struct mproc *p, struct imsg *imsg)
const void *data;
size_t sz;
- if (p->proc == PROC_SMTP) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_SMTP_ENQUEUE_FD:
+ case IMSG_CTL_SMTP_SESSION:
c = tree_get(&ctl_conns, imsg->hdr.peerid);
if (c == NULL)
return;
@@ -119,7 +119,7 @@ control_imsg(struct mproc *p, struct imsg *imsg)
return;
}
}
- if (p->proc == PROC_MTA) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
case IMSG_CTL_OK:
case IMSG_CTL_FAIL:
@@ -283,12 +283,10 @@ control(void)
config_peer(PROC_SCHEDULER);
config_peer(PROC_QUEUE);
- config_peer(PROC_SMTP);
config_peer(PROC_MFA);
config_peer(PROC_PARENT);
config_peer(PROC_LKA);
- config_peer(PROC_MDA);
- config_peer(PROC_MTA);
+ config_peer(PROC_PONY);
config_done();
control_listen();
@@ -448,29 +446,23 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
}
switch (imsg->hdr.type) {
- case IMSG_SMTP_ENQUEUE_FD:
+ case IMSG_CTL_SMTP_SESSION:
if (env->sc_flags & (SMTPD_SMTP_PAUSED | SMTPD_EXITING)) {
m_compose(p, IMSG_CTL_FAIL, 0, 0, -1, NULL, 0);
return;
}
- m_compose(p_smtp, IMSG_SMTP_ENQUEUE_FD, c->id, 0, -1,
+ m_compose(p_pony, IMSG_CTL_SMTP_SESSION, c->id, 0, -1,
&c->euid, sizeof(c->euid));
return;
- case IMSG_STATS:
- if (c->euid)
- goto badcred;
- m_compose(p, IMSG_STATS, 0, 0, -1, NULL, 0);
- return;
-
- case IMSG_DIGEST:
+ case IMSG_CTL_GET_DIGEST:
if (c->euid)
goto badcred;
digest.timestamp = time(NULL);
- m_compose(p, IMSG_DIGEST, 0, 0, -1, &digest, sizeof digest);
+ m_compose(p, IMSG_CTL_GET_DIGEST, 0, 0, -1, &digest, sizeof digest);
return;
- case IMSG_STATS_GET:
+ case IMSG_CTL_GET_STATS:
if (c->euid)
goto badcred;
kvp = imsg->data;
@@ -480,7 +472,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
strlcpy(kvp->key, key, sizeof kvp->key);
kvp->val = val;
}
- m_compose(p, IMSG_STATS_GET, 0, 0, -1, kvp, sizeof *kvp);
+ m_compose(p, IMSG_CTL_GET_STATS, 0, 0, -1, kvp, sizeof *kvp);
return;
case IMSG_CTL_SHUTDOWN:
@@ -517,7 +509,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
m_compose(p, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
return;
- case IMSG_CTL_TRACE:
+ case IMSG_CTL_TRACE_ENABLE:
if (c->euid)
goto badcred;
@@ -528,14 +520,14 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
verbose |= v;
log_verbose(verbose);
- m_create(p_parent, IMSG_CTL_TRACE, 0, 0, -1);
+ m_create(p_parent, IMSG_CTL_TRACE_ENABLE, 0, 0, -1);
m_add_int(p_parent, v);
m_close(p_parent);
m_compose(p, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
return;
- case IMSG_CTL_UNTRACE:
+ case IMSG_CTL_TRACE_DISABLE:
if (c->euid)
goto badcred;
@@ -546,14 +538,14 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
verbose &= ~v;
log_verbose(verbose);
- m_create(p_parent, IMSG_CTL_UNTRACE, 0, 0, -1);
+ m_create(p_parent, IMSG_CTL_TRACE_DISABLE, 0, 0, -1);
m_add_int(p_parent, v);
m_close(p_parent);
m_compose(p, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
return;
- case IMSG_CTL_PROFILE:
+ case IMSG_CTL_PROFILE_ENABLE:
if (c->euid)
goto badcred;
@@ -563,14 +555,14 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
memcpy(&v, imsg->data, sizeof(v));
profiling |= v;
- m_create(p_parent, IMSG_CTL_PROFILE, 0, 0, -1);
+ m_create(p_parent, IMSG_CTL_PROFILE_ENABLE, 0, 0, -1);
m_add_int(p_parent, v);
m_close(p_parent);
m_compose(p, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
return;
- case IMSG_CTL_UNPROFILE:
+ case IMSG_CTL_PROFILE_DISABLE:
if (c->euid)
goto badcred;
@@ -580,7 +572,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
memcpy(&v, imsg->data, sizeof(v));
profiling &= ~v;
- m_create(p_parent, IMSG_CTL_UNPROFILE, 0, 0, -1);
+ m_create(p_parent, IMSG_CTL_PROFILE_DISABLE, 0, 0, -1);
m_add_int(p_parent, v);
m_close(p_parent);
@@ -633,7 +625,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
}
log_info("info: smtp paused");
env->sc_flags |= SMTPD_SMTP_PAUSED;
- m_compose(p_smtp, IMSG_CTL_PAUSE_SMTP, 0, 0, -1, NULL, 0);
+ m_compose(p_pony, IMSG_CTL_PAUSE_SMTP, 0, 0, -1, NULL, 0);
m_compose(p, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
return;
@@ -683,7 +675,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
}
log_info("info: smtp resumed");
env->sc_flags &= ~SMTPD_SMTP_PAUSED;
- m_forward(p_smtp, imsg);
+ m_forward(p_pony, imsg);
m_compose(p, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
return;
@@ -691,7 +683,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
if (c->euid)
goto badcred;
- m_forward(p_mta, imsg);
+ m_forward(p_pony, imsg);
m_compose(p, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
return;
@@ -718,7 +710,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
goto badcred;
imsg->hdr.peerid = c->id;
- m_forward(p_mta, imsg);
+ m_forward(p_pony, imsg);
return;
case IMSG_CTL_SHOW_STATUS:
@@ -737,10 +729,10 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
if (imsg->hdr.len - IMSG_HEADER_SIZE <= sizeof(ss))
goto invalid;
memmove(&ss, imsg->data, sizeof(ss));
- m_create(p_mta, imsg->hdr.type, c->id, 0, -1);
- m_add_sockaddr(p_mta, (struct sockaddr *)&ss);
- m_add_string(p_mta, (char *)imsg->data + sizeof(ss));
- m_close(p_mta);
+ m_create(p_pony, imsg->hdr.type, c->id, 0, -1);
+ m_add_sockaddr(p_pony, (struct sockaddr *)&ss);
+ m_add_string(p_pony, (char *)imsg->data + sizeof(ss));
+ m_close(p_pony);
return;
case IMSG_CTL_SCHEDULE:
@@ -759,7 +751,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg)
m_forward(p_scheduler, imsg);
return;
- case IMSG_LKA_UPDATE_TABLE:
+ case IMSG_CTL_UPDATE_TABLE:
if (c->euid)
goto badcred;
diff --git a/usr.sbin/smtpd/dns.c b/usr.sbin/smtpd/dns.c
index ba8432b81a8..b45461a7daa 100644
--- a/usr.sbin/smtpd/dns.c
+++ b/usr.sbin/smtpd/dns.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dns.c,v 1.75 2014/04/03 11:32:02 eric Exp $ */
+/* $OpenBSD: dns.c,v 1.76 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -138,43 +138,6 @@ static int unpack_query(struct unpack *, struct dns_query *);
static int unpack_rr(struct unpack *, struct dns_rr *);
-void
-dns_query_host(uint64_t id, const char *host)
-{
- m_create(p_lka, IMSG_DNS_HOST, 0, 0, -1);
- m_add_id(p_lka, id);
- m_add_string(p_lka, host);
- m_close(p_lka);
-}
-
-void
-dns_query_ptr(uint64_t id, const struct sockaddr *sa)
-{
- m_create(p_lka, IMSG_DNS_PTR, 0, 0, -1);
- m_add_id(p_lka, id);
- m_add_sockaddr(p_lka, sa);
- m_close(p_lka);
-}
-
-void
-dns_query_mx(uint64_t id, const char *domain)
-{
- m_create(p_lka, IMSG_DNS_MX, 0, 0, -1);
- m_add_id(p_lka, id);
- m_add_string(p_lka, domain);
- m_close(p_lka);
-}
-
-void
-dns_query_mx_preference(uint64_t id, const char *domain, const char *mx)
-{
- m_create(p_lka, IMSG_DNS_MX_PREFERENCE, 0, 0, -1);
- m_add_id(p_lka, id);
- m_add_string(p_lka, domain);
- m_add_string(p_lka, mx);
- m_close(p_lka);
-}
-
static int
domainname_is_addr(const char *s, struct sockaddr *sa, socklen_t *sl)
{
@@ -241,13 +204,14 @@ dns_imsg(struct mproc *p, struct imsg *imsg)
switch (s->type) {
- case IMSG_DNS_HOST:
+ case IMSG_MTA_DNS_HOST:
m_get_string(&m, &host);
m_end(&m);
dns_lookup_host(s, host, -1);
return;
- case IMSG_DNS_PTR:
+ case IMSG_MTA_DNS_PTR:
+ case IMSG_SMTP_DNS_PTR:
sa = (struct sockaddr *)&ss;
m_get_sockaddr(&m, sa);
m_end(&m);
@@ -256,7 +220,7 @@ dns_imsg(struct mproc *p, struct imsg *imsg)
event_asr_run(as, dns_dispatch_ptr, s);
return;
- case IMSG_DNS_MX:
+ case IMSG_MTA_DNS_MX:
m_get_string(&m, &domain);
m_end(&m);
strlcpy(s->name, domain, sizeof(s->name));
@@ -265,13 +229,13 @@ dns_imsg(struct mproc *p, struct imsg *imsg)
sl = sizeof(ss);
if (domainname_is_addr(domain, sa, &sl)) {
- m_create(s->p, IMSG_DNS_HOST, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_HOST, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_sockaddr(s->p, sa);
m_add_int(s->p, -1);
m_close(s->p);
- m_create(s->p, IMSG_DNS_HOST_END, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_HOST_END, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_int(s->p, DNS_OK);
m_close(s->p);
@@ -282,7 +246,7 @@ dns_imsg(struct mproc *p, struct imsg *imsg)
as = res_query_async(s->name, C_IN, T_MX, NULL);
if (as == NULL) {
log_warn("warn: req_query_async: %s", s->name);
- m_create(s->p, IMSG_DNS_HOST_END, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_HOST_END, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_int(s->p, DNS_EINVAL);
m_close(s->p);
@@ -293,7 +257,7 @@ dns_imsg(struct mproc *p, struct imsg *imsg)
event_asr_run(as, dns_dispatch_mx, s);
return;
- case IMSG_DNS_MX_PREFERENCE:
+ case IMSG_MTA_DNS_MX_PREFERENCE:
m_get_string(&m, &domain);
m_get_string(&m, &mx);
m_end(&m);
@@ -304,7 +268,7 @@ dns_imsg(struct mproc *p, struct imsg *imsg)
as = res_query_async(domain, C_IN, T_MX, NULL);
if (as == NULL) {
- m_create(s->p, IMSG_DNS_MX_PREFERENCE, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_MX_PREFERENCE, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_int(s->p, DNS_ENOTFOUND);
m_close(s->p);
@@ -332,7 +296,7 @@ dns_dispatch_host(struct asr_result *ar, void *arg)
for (ai = ar->ar_addrinfo; ai; ai = ai->ai_next) {
s->mxfound++;
- m_create(s->p, IMSG_DNS_HOST, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_HOST, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_sockaddr(s->p, ai->ai_addr);
m_add_int(s->p, lookup->preference);
@@ -348,7 +312,7 @@ dns_dispatch_host(struct asr_result *ar, void *arg)
if (--s->refcount)
return;
- m_create(s->p, IMSG_DNS_HOST_END, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_HOST_END, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_int(s->p, s->mxfound ? DNS_OK : DNS_ENOTFOUND);
m_close(s->p);
@@ -361,7 +325,7 @@ dns_dispatch_ptr(struct asr_result *ar, void *arg)
struct dns_session *s = arg;
/* The error code could be more precise, but we don't currently care */
- m_create(s->p, IMSG_DNS_PTR, 0, 0, -1);
+ m_create(s->p, s->type, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_int(s->p, ar->ar_gai_errno ? DNS_ENOTFOUND : DNS_OK);
if (ar->ar_gai_errno == 0)
@@ -383,7 +347,7 @@ dns_dispatch_mx(struct asr_result *ar, void *arg)
if (ar->ar_h_errno && ar->ar_h_errno != NO_DATA) {
- m_create(s->p, IMSG_DNS_HOST_END, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_HOST_END, 0, 0, -1);
m_add_id(s->p, s->reqid);
if (ar->ar_rcode == NXDOMAIN)
m_add_int(s->p, DNS_ENONAME);
@@ -458,7 +422,7 @@ dns_dispatch_mx_preference(struct asr_result *ar, void *arg)
free(ar->ar_data);
- m_create(s->p, IMSG_DNS_MX_PREFERENCE, 0, 0, -1);
+ m_create(s->p, IMSG_MTA_DNS_MX_PREFERENCE, 0, 0, -1);
m_add_id(s->p, s->reqid);
m_add_int(s->p, error);
if (error == DNS_OK)
diff --git a/usr.sbin/smtpd/enqueue.c b/usr.sbin/smtpd/enqueue.c
index 70d63c4c942..b0797e918b3 100644
--- a/usr.sbin/smtpd/enqueue.c
+++ b/usr.sbin/smtpd/enqueue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: enqueue.c,v 1.77 2014/03/25 10:06:29 gilles Exp $ */
+/* $OpenBSD: enqueue.c,v 1.78 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2005 Henning Brauer <henning@bulabula.org>
@@ -760,7 +760,7 @@ open_connection(void)
int fd;
int n;
- imsg_compose(ibuf, IMSG_SMTP_ENQUEUE_FD, IMSG_VERSION, 0, -1, NULL, 0);
+ imsg_compose(ibuf, IMSG_CTL_SMTP_SESSION, IMSG_VERSION, 0, -1, NULL, 0);
while (ibuf->w.queued)
if (msgbuf_write(&ibuf->w) < 0 && errno != EAGAIN)
diff --git a/usr.sbin/smtpd/lka.c b/usr.sbin/smtpd/lka.c
index 30205777408..460f0c08c9a 100644
--- a/usr.sbin/smtpd/lka.c
+++ b/usr.sbin/smtpd/lka.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lka.c,v 1.164 2014/02/04 13:44:41 eric Exp $ */
+/* $OpenBSD: lka.c,v 1.165 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -82,17 +82,18 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
int v;
const char *cafile = NULL;
- if (imsg->hdr.type == IMSG_DNS_HOST ||
- imsg->hdr.type == IMSG_DNS_PTR ||
- imsg->hdr.type == IMSG_DNS_MX ||
- imsg->hdr.type == IMSG_DNS_MX_PREFERENCE) {
+ if (imsg->hdr.type == IMSG_MTA_DNS_HOST ||
+ imsg->hdr.type == IMSG_MTA_DNS_PTR ||
+ imsg->hdr.type == IMSG_SMTP_DNS_PTR ||
+ imsg->hdr.type == IMSG_MTA_DNS_MX ||
+ imsg->hdr.type == IMSG_MTA_DNS_MX_PREFERENCE) {
dns_imsg(p, imsg);
return;
}
- if (p->proc == PROC_SMTP) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_LKA_EXPAND_RCPT:
+ case IMSG_SMTP_EXPAND_RCPT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_envelope(&m, &evp);
@@ -100,7 +101,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
lka_session(reqid, &evp);
return;
- case IMSG_LKA_HELO:
+ case IMSG_SMTP_LOOKUP_HELO:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &tablename);
@@ -110,7 +111,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
ret = lka_addrname(tablename, (struct sockaddr*)&ss,
&addrname);
- m_create(p, IMSG_LKA_HELO, 0, 0, -1);
+ m_create(p, IMSG_SMTP_LOOKUP_HELO, 0, 0, -1);
m_add_id(p, reqid);
m_add_int(p, ret);
if (ret == LKA_OK)
@@ -118,7 +119,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
m_close(p);
return;
- case IMSG_LKA_SSL_INIT:
+ case IMSG_SMTP_SSL_INIT:
req_ca_cert = imsg->data;
resp_ca_cert.reqid = req_ca_cert->reqid;
@@ -127,7 +128,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
pki = dict_get(env->sc_pki_dict, buf);
if (pki == NULL) {
resp_ca_cert.status = CA_FAIL;
- m_compose(p, IMSG_LKA_SSL_INIT, 0, 0, -1, &resp_ca_cert,
+ m_compose(p, IMSG_SMTP_SSL_INIT, 0, 0, -1, &resp_ca_cert,
sizeof(resp_ca_cert));
return;
}
@@ -140,10 +141,10 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
iov[1].iov_len = pki->pki_cert_len;
iov[2].iov_base = pki->pki_key;
iov[2].iov_len = pki->pki_key_len;
- m_composev(p, IMSG_LKA_SSL_INIT, 0, 0, -1, iov, nitems(iov));
+ m_composev(p, IMSG_SMTP_SSL_INIT, 0, 0, -1, iov, nitems(iov));
return;
- case IMSG_LKA_SSL_VERIFY_CERT:
+ case IMSG_SMTP_SSL_VERIFY_CERT:
req_ca_vrfy_smtp = xmemdup(imsg->data, sizeof *req_ca_vrfy_smtp, "lka:ca_vrfy");
req_ca_vrfy_smtp->cert = xmemdup((char *)imsg->data +
sizeof *req_ca_vrfy_smtp, req_ca_vrfy_smtp->cert_len, "lka:ca_vrfy");
@@ -153,7 +154,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
sizeof (off_t), "lka:ca_vrfy");
return;
- case IMSG_LKA_SSL_VERIFY_CHAIN:
+ case IMSG_SMTP_SSL_VERIFY_CHAIN:
if (req_ca_vrfy_smtp == NULL)
fatalx("lka:ca_vrfy: chain without a certificate");
req_ca_vrfy_chain = imsg->data;
@@ -163,7 +164,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
req_ca_vrfy_smtp->chain_offset++;
return;
- case IMSG_LKA_SSL_VERIFY:
+ case IMSG_SMTP_SSL_VERIFY:
if (req_ca_vrfy_smtp == NULL)
fatalx("lka:ca_vrfy: verify without a certificate");
@@ -177,7 +178,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
else
resp_ca_vrfy.status = CA_OK;
- m_compose(p, IMSG_LKA_SSL_VERIFY, 0, 0, -1, &resp_ca_vrfy,
+ m_compose(p, IMSG_SMTP_SSL_VERIFY, 0, 0, -1, &resp_ca_vrfy,
sizeof resp_ca_vrfy);
for (i = 0; i < req_ca_vrfy_smtp->n_chain; ++i)
@@ -188,7 +189,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
free(req_ca_vrfy_smtp);
return;
- case IMSG_LKA_AUTHENTICATE:
+ case IMSG_SMTP_AUTHENTICATE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &tablename);
@@ -216,9 +217,9 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
}
}
- if (p->proc == PROC_MDA) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_LKA_USERINFO:
+ case IMSG_MDA_LOOKUP_USERINFO:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &tablename);
@@ -227,7 +228,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
ret = lka_userinfo(tablename, username, &userinfo);
- m_create(p, IMSG_LKA_USERINFO, 0, 0, -1);
+ m_create(p, IMSG_MDA_LOOKUP_USERINFO, 0, 0, -1);
m_add_id(p, reqid);
m_add_int(p, ret);
if (ret == LKA_OK)
@@ -237,10 +238,10 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
}
}
- if (p->proc == PROC_MTA) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_LKA_SSL_INIT:
+ case IMSG_MTA_SSL_INIT:
req_ca_cert = imsg->data;
resp_ca_cert.reqid = req_ca_cert->reqid;
@@ -249,7 +250,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
pki = dict_get(env->sc_pki_dict, buf);
if (pki == NULL) {
resp_ca_cert.status = CA_FAIL;
- m_compose(p, IMSG_LKA_SSL_INIT, 0, 0, -1, &resp_ca_cert,
+ m_compose(p, IMSG_MTA_SSL_INIT, 0, 0, -1, &resp_ca_cert,
sizeof(resp_ca_cert));
return;
}
@@ -262,10 +263,10 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
iov[1].iov_len = pki->pki_cert_len;
iov[2].iov_base = pki->pki_key;
iov[2].iov_len = pki->pki_key_len;
- m_composev(p, IMSG_LKA_SSL_INIT, 0, 0, -1, iov, nitems(iov));
+ m_composev(p, IMSG_MTA_SSL_INIT, 0, 0, -1, iov, nitems(iov));
return;
- case IMSG_LKA_SSL_VERIFY_CERT:
+ case IMSG_MTA_SSL_VERIFY_CERT:
req_ca_vrfy_mta = xmemdup(imsg->data, sizeof *req_ca_vrfy_mta, "lka:ca_vrfy");
req_ca_vrfy_mta->cert = xmemdup((char *)imsg->data +
sizeof *req_ca_vrfy_mta, req_ca_vrfy_mta->cert_len, "lka:ca_vrfy");
@@ -275,7 +276,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
sizeof (off_t), "lka:ca_vrfy");
return;
- case IMSG_LKA_SSL_VERIFY_CHAIN:
+ case IMSG_MTA_SSL_VERIFY_CHAIN:
if (req_ca_vrfy_mta == NULL)
fatalx("lka:ca_vrfy: verify without a certificate");
@@ -286,7 +287,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
req_ca_vrfy_mta->chain_offset++;
return;
- case IMSG_LKA_SSL_VERIFY:
+ case IMSG_MTA_SSL_VERIFY:
if (req_ca_vrfy_mta == NULL)
fatalx("lka:ca_vrfy: verify without a certificate");
@@ -301,7 +302,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
else
resp_ca_vrfy.status = CA_OK;
- m_compose(p, IMSG_LKA_SSL_VERIFY, 0, 0, -1, &resp_ca_vrfy,
+ m_compose(p, IMSG_MTA_SSL_VERIFY, 0, 0, -1, &resp_ca_vrfy,
sizeof resp_ca_vrfy);
for (i = 0; i < req_ca_vrfy_mta->n_chain; ++i)
@@ -312,7 +313,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
free(req_ca_vrfy_mta);
return;
- case IMSG_LKA_SECRET:
+ case IMSG_MTA_LOOKUP_CREDENTIALS:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &tablename);
@@ -321,13 +322,13 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
lka_credentials(tablename, label, buf, sizeof(buf));
- m_create(p, IMSG_LKA_SECRET, 0, 0, -1);
+ m_create(p, IMSG_MTA_LOOKUP_CREDENTIALS, 0, 0, -1);
m_add_id(p, reqid);
m_add_string(p, buf);
m_close(p);
return;
- case IMSG_LKA_SOURCE:
+ case IMSG_MTA_LOOKUP_SOURCE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &tablename);
@@ -335,7 +336,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
table = table_find(tablename, NULL);
- m_create(p, IMSG_LKA_SOURCE, 0, 0, -1);
+ m_create(p, IMSG_MTA_LOOKUP_SOURCE, 0, 0, -1);
m_add_id(p, reqid);
if (table == NULL) {
@@ -358,7 +359,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
m_close(p);
return;
- case IMSG_LKA_HELO:
+ case IMSG_MTA_LOOKUP_HELO:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &tablename);
@@ -368,7 +369,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
ret = lka_addrname(tablename, (struct sockaddr*)&ss,
&addrname);
- m_create(p, IMSG_LKA_HELO, 0, 0, -1);
+ m_create(p, IMSG_MTA_LOOKUP_HELO, 0, 0, -1);
m_add_id(p, reqid);
m_add_int(p, ret);
if (ret == LKA_OK)
@@ -390,9 +391,7 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
table_open_all();
/* Start fulfilling requests */
- mproc_enable(p_mda);
- mproc_enable(p_mta);
- mproc_enable(p_smtp);
+ mproc_enable(p_pony);
return;
case IMSG_CTL_VERBOSE:
@@ -409,19 +408,19 @@ lka_imsg(struct mproc *p, struct imsg *imsg)
profiling = v;
return;
- case IMSG_PARENT_FORWARD_OPEN:
+ case IMSG_LKA_OPEN_FORWARD:
lka_session_forward_reply(imsg->data, imsg->fd);
return;
case IMSG_LKA_AUTHENTICATE:
- m_forward(p_smtp, imsg);
+ m_forward(p_pony, imsg);
return;
}
}
if (p->proc == PROC_CONTROL) {
switch (imsg->hdr.type) {
- case IMSG_LKA_UPDATE_TABLE:
+ case IMSG_CTL_UPDATE_TABLE:
table = table_find(imsg->data, NULL);
if (table == NULL) {
log_warnx("warn: Lookup table not found: "
@@ -509,16 +508,12 @@ lka(void)
config_peer(PROC_PARENT);
config_peer(PROC_QUEUE);
- config_peer(PROC_SMTP);
- config_peer(PROC_MDA);
- config_peer(PROC_MTA);
config_peer(PROC_CONTROL);
+ config_peer(PROC_PONY);
config_done();
/* Ignore them until we get our config */
- mproc_disable(p_mda);
- mproc_disable(p_mta);
- mproc_disable(p_smtp);
+ mproc_disable(p_pony);
if (event_dispatch() < 0)
fatal("event_dispatch");
diff --git a/usr.sbin/smtpd/lka_session.c b/usr.sbin/smtpd/lka_session.c
index 6ff19013a10..4cc6f5af83d 100644
--- a/usr.sbin/smtpd/lka_session.c
+++ b/usr.sbin/smtpd/lka_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lka_session.c,v 1.64 2014/02/28 16:00:11 eric Exp $ */
+/* $OpenBSD: lka_session.c,v 1.65 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@poolp.org>
@@ -229,20 +229,20 @@ lka_resume(struct lka_session *lks)
}
error:
if (lks->error) {
- m_create(p_smtp, IMSG_LKA_EXPAND_RCPT, 0, 0, -1);
- m_add_id(p_smtp, lks->id);
- m_add_int(p_smtp, lks->error);
+ m_create(p_pony, IMSG_SMTP_EXPAND_RCPT, 0, 0, -1);
+ m_add_id(p_pony, lks->id);
+ m_add_int(p_pony, lks->error);
if (lks->errormsg)
- m_add_string(p_smtp, lks->errormsg);
+ m_add_string(p_pony, lks->errormsg);
else {
if (lks->error == LKA_PERMFAIL)
- m_add_string(p_smtp, "550 Invalid recipient");
+ m_add_string(p_pony, "550 Invalid recipient");
else if (lks->error == LKA_TEMPFAIL)
- m_add_string(p_smtp, "451 Temporary failure");
+ m_add_string(p_pony, "451 Temporary failure");
}
- m_close(p_smtp);
+ m_close(p_pony);
while ((ep = TAILQ_FIRST(&lks->deliverylist)) != NULL) {
TAILQ_REMOVE(&lks->deliverylist, ep, entry);
free(ep);
@@ -252,14 +252,14 @@ lka_resume(struct lka_session *lks)
/* Process the delivery list and submit envelopes to queue */
while ((ep = TAILQ_FIRST(&lks->deliverylist)) != NULL) {
TAILQ_REMOVE(&lks->deliverylist, ep, entry);
- m_create(p_queue, IMSG_QUEUE_SUBMIT_ENVELOPE, 0, 0, -1);
+ m_create(p_queue, IMSG_LKA_ENVELOPE_SUBMIT, 0, 0, -1);
m_add_id(p_queue, lks->id);
m_add_envelope(p_queue, ep);
m_close(p_queue);
free(ep);
}
- m_create(p_queue, IMSG_QUEUE_COMMIT_ENVELOPES, 0, 0, -1);
+ m_create(p_queue, IMSG_LKA_ENVELOPE_COMMIT, 0, 0, -1);
m_add_id(p_queue, lks->id);
m_close(p_queue);
}
@@ -415,7 +415,7 @@ lka_expand(struct lka_session *lks, struct rule *rule, struct expandnode *xn)
fwreq.uid = lk.userinfo.uid;
fwreq.gid = lk.userinfo.gid;
- m_compose(p_parent, IMSG_PARENT_FORWARD_OPEN, 0, 0, -1,
+ m_compose(p_parent, IMSG_LKA_OPEN_FORWARD, 0, 0, -1,
&fwreq, sizeof(fwreq));
lks->flags |= F_WAITING;
break;
diff --git a/usr.sbin/smtpd/mda.c b/usr.sbin/smtpd/mda.c
index 77afab1a5aa..44240e79def 100644
--- a/usr.sbin/smtpd/mda.c
+++ b/usr.sbin/smtpd/mda.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mda.c,v 1.102 2014/02/04 15:44:05 eric Exp $ */
+/* $OpenBSD: mda.c,v 1.103 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -83,16 +83,17 @@ struct mda_session {
FILE *datafp;
};
-static void mda_imsg(struct mproc *, struct imsg *);
static void mda_io(struct io *, int);
-static void mda_shutdown(void);
-static void mda_sig_handler(int, short, void *);
static int mda_check_loop(FILE *, struct mda_envelope *);
static int mda_getlastline(int, char *, size_t);
static void mda_done(struct mda_session *);
static void mda_fail(struct mda_user *, int, const char *, enum enhanced_status_code);
static void mda_drain(void);
static void mda_log(const struct mda_envelope *, const char *, const char *);
+static void mda_queue_ok(uint64_t);
+static void mda_queue_tempfail(uint64_t, const char *, enum enhanced_status_code);
+static void mda_queue_permfail(uint64_t, const char *, enum enhanced_status_code);
+static void mda_queue_loop(uint64_t);
static struct mda_user *mda_user(const struct envelope *);
static void mda_user_free(struct mda_user *);
static const char *mda_user_to_text(const struct mda_user *);
@@ -105,7 +106,7 @@ static struct tree users;
static TAILQ_HEAD(, mda_user) runnable;
-static void
+void
mda_imsg(struct mproc *p, struct imsg *imsg)
{
struct mda_session *s;
@@ -120,12 +121,12 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
uint64_t reqid;
size_t sz;
char out[256], buf[SMTPD_MAXLINESIZE];
- int n, v;
+ int n;
enum lka_resp_status status;
if (p->proc == PROC_LKA) {
switch (imsg->hdr.type) {
- case IMSG_LKA_USERINFO:
+ case IMSG_MDA_LOOKUP_USERINFO:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, (int *)&status);
@@ -157,7 +158,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_QUEUE) {
switch (imsg->hdr.type) {
- case IMSG_MDA_DELIVER:
+ case IMSG_QUEUE_DELIVER:
m_msg(&m, imsg);
m_get_envelope(&m, &evp);
m_end(&m);
@@ -175,7 +176,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
if (u->flags & USER_ONHOLD) {
u->flags |= USER_HOLDQ;
- m_create(p_queue, IMSG_DELIVERY_HOLD, 0, 0, -1);
+ m_create(p_queue, IMSG_MDA_DELIVERY_HOLD, 0, 0, -1);
m_add_evpid(p_queue, evp.id);
m_add_id(p_queue, u->id);
m_close(p_queue);
@@ -196,7 +197,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
mda_drain();
return;
- case IMSG_QUEUE_MESSAGE_FD:
+ case IMSG_MDA_OPEN_MESSAGE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
@@ -206,7 +207,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
if (imsg->fd == -1) {
log_debug("debug: mda: cannot get message fd");
- queue_tempfail(e->id, "Cannot get message fd",
+ mda_queue_tempfail(e->id, "Cannot get message fd",
ESC_OTHER_MAIL_SYSTEM_STATUS);
mda_log(e, "TempFail", "Cannot get message fd");
mda_done(s);
@@ -220,7 +221,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
if ((s->datafp = fdopen(imsg->fd, "r")) == NULL) {
log_warn("warn: mda: fdopen");
close(imsg->fd);
- queue_tempfail(e->id, "fdopen failed",
+ mda_queue_tempfail(e->id, "fdopen failed",
ESC_OTHER_MAIL_SYSTEM_STATUS);
mda_log(e, "TempFail", "fdopen failed");
mda_done(s);
@@ -230,7 +231,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
/* check delivery loop */
if (mda_check_loop(s->datafp, e)) {
log_debug("debug: mda: loop detected");
- queue_loop(e->id);
+ mda_queue_loop(e->id);
mda_log(e, "PermFail", "Loop detected");
mda_done(s);
return;
@@ -249,7 +250,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
if (n == -1) {
log_warn("warn: mda: "
"fail to write delivery info");
- queue_tempfail(e->id, "Out of memory",
+ mda_queue_tempfail(e->id, "Out of memory",
ESC_OTHER_MAIL_SYSTEM_STATUS);
mda_log(e, "TempFail", "Out of memory");
mda_done(s);
@@ -322,7 +323,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
"for session %016"PRIx64 " evpid %016"PRIx64,
s->id, s->evp->id);
- m_create(p_parent, IMSG_PARENT_FORK_MDA, 0, 0, -1);
+ m_create(p_parent, IMSG_MDA_FORK, 0, 0, -1);
m_add_id(p_parent, reqid);
m_add_data(p_parent, &deliver, sizeof(deliver));
m_close(p_parent);
@@ -332,7 +333,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_PARENT) {
switch (imsg->hdr.type) {
- case IMSG_PARENT_FORK_MDA:
+ case IMSG_MDA_FORK:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
@@ -341,7 +342,7 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
e = s->evp;
if (imsg->fd == -1) {
log_warn("warn: mda: fail to retrieve mda fd");
- queue_tempfail(e->id, "Cannot get mda fd",
+ mda_queue_tempfail(e->id, "Cannot get mda fd",
ESC_OTHER_MAIL_SYSTEM_STATUS);
mda_log(e, "TempFail", "Cannot get mda fd");
mda_done(s);
@@ -385,117 +386,34 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
/* update queue entry */
if (error) {
- queue_tempfail(e->id, error,
+ mda_queue_tempfail(e->id, error,
ESC_OTHER_MAIL_SYSTEM_STATUS);
snprintf(buf, sizeof buf, "Error (%s)", error);
mda_log(e, "TempFail", buf);
}
else {
- queue_ok(e->id);
+ mda_queue_ok(e->id);
mda_log(e, "Ok", "Delivered");
}
mda_done(s);
return;
-
- case IMSG_CTL_VERBOSE:
- m_msg(&m, imsg);
- m_get_int(&m, &v);
- m_end(&m);
- log_verbose(v);
- return;
-
- case IMSG_CTL_PROFILE:
- m_msg(&m, imsg);
- m_get_int(&m, &v);
- m_end(&m);
- profiling = v;
- return;
}
}
errx(1, "mda_imsg: unexpected %s imsg", imsg_to_str(imsg->hdr.type));
}
-static void
-mda_sig_handler(int sig, short event, void *p)
+void
+mda_postfork()
{
- switch (sig) {
- case SIGINT:
- case SIGTERM:
- mda_shutdown();
- break;
- default:
- fatalx("mda_sig_handler: unexpected signal");
- }
}
-static void
-mda_shutdown(void)
+void
+mda_postprivdrop()
{
- log_info("info: mail delivery agent exiting");
- _exit(0);
-}
-
-pid_t
-mda(void)
-{
- pid_t pid;
- struct passwd *pw;
- struct event ev_sigint;
- struct event ev_sigterm;
-
- switch (pid = fork()) {
- case -1:
- fatal("mda: cannot fork");
- case 0:
- post_fork(PROC_MDA);
- break;
- default:
- return (pid);
- }
-
- purge_config(PURGE_EVERYTHING);
-
- if ((pw = getpwnam(SMTPD_USER)) == NULL)
- fatalx("unknown user " SMTPD_USER);
-
- if (chroot(PATH_CHROOT) == -1)
- fatal("mda: chroot");
- if (chdir("/") == -1)
- fatal("mda: chdir(\"/\")");
-
- config_process(PROC_MDA);
-
- if (setgroups(1, &pw->pw_gid) ||
- setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
- setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
- fatal("mda: cannot drop privileges");
-
tree_init(&sessions);
tree_init(&users);
TAILQ_INIT(&runnable);
-
- imsg_callback = mda_imsg;
- event_init();
-
- signal_set(&ev_sigint, SIGINT, mda_sig_handler, NULL);
- signal_set(&ev_sigterm, SIGTERM, mda_sig_handler, NULL);
- signal_add(&ev_sigint, NULL);
- signal_add(&ev_sigterm, NULL);
- signal(SIGPIPE, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
-
- config_peer(PROC_PARENT);
- config_peer(PROC_QUEUE);
- config_peer(PROC_LKA);
- config_peer(PROC_CONTROL);
- config_done();
-
- if (event_dispatch() < 0)
- fatal("event_dispatch");
- mda_shutdown();
-
- return (0);
}
static void
@@ -525,7 +443,7 @@ mda_io(struct io *io, int evt)
if ((ln = fgetln(s->datafp, &len)) == NULL)
break;
if (iobuf_queue(&s->iobuf, ln, len) == -1) {
- m_create(p_parent, IMSG_PARENT_KILL_MDA,
+ m_create(p_parent, IMSG_MDA_KILL,
0, 0, -1);
m_add_id(p_parent, s->id);
m_add_string(p_parent, "Out of memory");
@@ -543,7 +461,7 @@ mda_io(struct io *io, int evt)
if (ferror(s->datafp)) {
log_debug("debug: mda: ferror on session %016"PRIx64,
s->id);
- m_create(p_parent, IMSG_PARENT_KILL_MDA, 0, 0, -1);
+ m_create(p_parent, IMSG_MDA_KILL, 0, 0, -1);
m_add_id(p_parent, s->id);
m_add_string(p_parent, "Error reading body");
m_close(p_parent);
@@ -677,11 +595,11 @@ mda_fail(struct mda_user *user, int permfail, const char *error, enum enhanced_s
TAILQ_REMOVE(&user->envelopes, e, entry);
if (permfail) {
mda_log(e, "PermFail", error);
- queue_permfail(e->id, error, code);
+ mda_queue_permfail(e->id, error, code);
}
else {
mda_log(e, "TempFail", error);
- queue_tempfail(e->id, error, code);
+ mda_queue_tempfail(e->id, error, code);
}
mda_envelope_free(e);
}
@@ -736,7 +654,7 @@ mda_drain(void)
u->flags &= ~USER_ONHOLD;
}
if (u->flags & USER_HOLDQ) {
- m_create(p_queue, IMSG_DELIVERY_RELEASE, 0, 0, -1);
+ m_create(p_queue, IMSG_MDA_HOLDQ_RELEASE, 0, 0, -1);
m_add_id(p_queue, u->id);
m_add_int(p_queue, env->sc_mda_task_release);
m_close(p_queue);
@@ -813,6 +731,42 @@ mda_log(const struct mda_envelope *evp, const char *prefix, const char *status)
status);
}
+static void
+mda_queue_ok(uint64_t evpid)
+{
+ m_create(p_queue, IMSG_MDA_DELIVERY_OK, 0, 0, -1);
+ m_add_evpid(p_queue, evpid);
+ m_close(p_queue);
+}
+
+static void
+mda_queue_tempfail(uint64_t evpid, const char *reason, enum enhanced_status_code code)
+{
+ m_create(p_queue, IMSG_MDA_DELIVERY_TEMPFAIL, 0, 0, -1);
+ m_add_evpid(p_queue, evpid);
+ m_add_string(p_queue, reason);
+ m_add_int(p_queue, (int)code);
+ m_close(p_queue);
+}
+
+static void
+mda_queue_permfail(uint64_t evpid, const char *reason, enum enhanced_status_code code)
+{
+ m_create(p_queue, IMSG_MDA_DELIVERY_PERMFAIL, 0, 0, -1);
+ m_add_evpid(p_queue, evpid);
+ m_add_string(p_queue, reason);
+ m_add_int(p_queue, (int)code);
+ m_close(p_queue);
+}
+
+static void
+mda_queue_loop(uint64_t evpid)
+{
+ m_create(p_queue, IMSG_MDA_DELIVERY_LOOP, 0, 0, -1);
+ m_add_evpid(p_queue, evpid);
+ m_close(p_queue);
+}
+
static struct mda_user *
mda_user(const struct envelope *evp)
{
@@ -835,7 +789,7 @@ mda_user(const struct envelope *evp)
tree_xset(&users, u->id, u);
- m_create(p_lka, IMSG_LKA_USERINFO, 0, 0, -1);
+ m_create(p_lka, IMSG_MDA_LOOKUP_USERINFO, 0, 0, -1);
m_add_id(p_lka, u->id);
m_add_string(p_lka, evp->agent.mda.usertable);
m_add_string(p_lka, evp->agent.mda.username);
@@ -855,7 +809,7 @@ mda_user_free(struct mda_user *u)
tree_xpop(&users, u->id);
if (u->flags & USER_HOLDQ) {
- m_create(p_queue, IMSG_DELIVERY_RELEASE, 0, 0, -1);
+ m_create(p_queue, IMSG_MDA_HOLDQ_RELEASE, 0, 0, -1);
m_add_id(p_queue, u->id);
m_add_int(p_queue, 0);
m_close(p_queue);
@@ -942,7 +896,7 @@ mda_session(struct mda_user * u)
" for user \"%s\" evpid %016" PRIx64, s->id,
mda_user_to_text(u), s->evp->id);
- m_create(p_queue, IMSG_QUEUE_MESSAGE_FD, 0, 0, -1);
+ m_create(p_queue, IMSG_MDA_OPEN_MESSAGE, 0, 0, -1);
m_add_id(p_queue, s->id);
m_add_msgid(p_queue, evpid_to_msgid(s->evp->id));
m_close(p_queue);
diff --git a/usr.sbin/smtpd/mfa.c b/usr.sbin/smtpd/mfa.c
index 1da154c4ffe..6372a4dd77c 100644
--- a/usr.sbin/smtpd/mfa.c
+++ b/usr.sbin/smtpd/mfa.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mfa.c,v 1.81 2013/10/27 11:01:47 eric Exp $ */
+/* $OpenBSD: mfa.c,v 1.82 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -69,9 +69,9 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
uint32_t datalen; /* XXX make it off_t? */
int v, success, fdout;
- if (p->proc == PROC_SMTP) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_MFA_REQ_CONNECT:
+ case IMSG_SMTP_REQ_CONNECT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_sockaddr(&m, (struct sockaddr *)&local);
@@ -82,7 +82,7 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
(struct sockaddr *)&remote, hostname);
return;
- case IMSG_MFA_REQ_HELO:
+ case IMSG_SMTP_REQ_HELO:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &line);
@@ -90,7 +90,7 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
mfa_filter_line(reqid, HOOK_HELO, line);
return;
- case IMSG_MFA_REQ_MAIL:
+ case IMSG_SMTP_REQ_MAIL:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_mailaddr(&m, &maddr);
@@ -98,7 +98,7 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
mfa_filter_mailaddr(reqid, HOOK_MAIL, &maddr);
return;
- case IMSG_MFA_REQ_RCPT:
+ case IMSG_SMTP_REQ_RCPT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_mailaddr(&m, &maddr);
@@ -106,14 +106,14 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
mfa_filter_mailaddr(reqid, HOOK_RCPT, &maddr);
return;
- case IMSG_MFA_REQ_DATA:
+ case IMSG_SMTP_REQ_DATA:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
mfa_filter(reqid, HOOK_DATA);
return;
- case IMSG_MFA_REQ_EOM:
+ case IMSG_SMTP_REQ_EOM:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_u32(&m, &datalen);
@@ -121,28 +121,28 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
mfa_filter_eom(reqid, HOOK_EOM, datalen);
return;
- case IMSG_MFA_EVENT_RSET:
+ case IMSG_SMTP_EVENT_RSET:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
mfa_filter_event(reqid, HOOK_RESET);
return;
- case IMSG_MFA_EVENT_COMMIT:
+ case IMSG_SMTP_EVENT_COMMIT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
mfa_filter_event(reqid, HOOK_COMMIT);
return;
- case IMSG_MFA_EVENT_ROLLBACK:
+ case IMSG_SMTP_EVENT_ROLLBACK:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
mfa_filter_event(reqid, HOOK_ROLLBACK);
return;
- case IMSG_MFA_EVENT_DISCONNECT:
+ case IMSG_SMTP_EVENT_DISCONNECT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
@@ -153,7 +153,7 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_QUEUE) {
switch (imsg->hdr.type) {
- case IMSG_QUEUE_MESSAGE_FILE:
+ case IMSG_SMTP_MESSAGE_OPEN: /* XXX bogus */
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &success);
@@ -170,9 +170,6 @@ mfa_imsg(struct mproc *p, struct imsg *imsg)
case IMSG_CONF_START:
return;
- case IMSG_CONF_FILTER:
- return;
-
case IMSG_CONF_END:
mfa_filter_init();
return;
@@ -278,11 +275,11 @@ mfa(void)
signal(SIGHUP, SIG_IGN);
config_peer(PROC_PARENT);
- config_peer(PROC_SMTP);
config_peer(PROC_CONTROL);
+ config_peer(PROC_PONY);
config_done();
- mproc_disable(p_smtp);
+ mproc_disable(p_pony);
if (event_dispatch() < 0)
fatal("event_dispatch");
@@ -295,7 +292,7 @@ void
mfa_ready(void)
{
log_debug("debug: mfa ready");
- mproc_enable(p_smtp);
+ mproc_enable(p_pony);
}
static int
@@ -385,12 +382,12 @@ mfa_tx_done(struct mfa_tx *tx)
if (tx->error) {
log_debug("debug: mfa: tx error");
- m_create(p_smtp, IMSG_MFA_SMTP_RESPONSE, 0, 0, -1);
- m_add_id(p_smtp, tx->reqid);
- m_add_int(p_smtp, MFA_FAIL);
- m_add_u32(p_smtp, 0);
- m_add_string(p_smtp, "Internal server error");
- m_close(p_smtp);
+ m_create(p_pony, IMSG_MFA_SMTP_RESPONSE, 0, 0, -1);
+ m_add_id(p_pony, tx->reqid);
+ m_add_int(p_pony, MFA_FAIL);
+ m_add_u32(p_pony, 0);
+ m_add_string(p_pony, "Internal server error");
+ m_close(p_pony);
}
#if 0
else
diff --git a/usr.sbin/smtpd/mfa_session.c b/usr.sbin/smtpd/mfa_session.c
index 312aedf650f..b882931672c 100644
--- a/usr.sbin/smtpd/mfa_session.c
+++ b/usr.sbin/smtpd/mfa_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mfa_session.c,v 1.20 2013/10/27 11:01:47 eric Exp $ */
+/* $OpenBSD: mfa_session.c,v 1.21 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@poolp.org>
@@ -389,10 +389,10 @@ mfa_set_fdout(struct mfa_session *s, int fdout)
log_trace(TRACE_MFA, "mfa: chain input is %d", fdout);
- m_create(p_smtp, IMSG_QUEUE_MESSAGE_FILE, 0, 0, fdout);
- m_add_id(p_smtp, s->id);
- m_add_int(p_smtp, 1);
- m_close(p_smtp);
+ m_create(p_pony, IMSG_SMTP_MESSAGE_OPEN, 0, 0, fdout); /* XXX bogus */
+ m_add_id(p_pony, s->id);
+ m_add_int(p_pony, 1);
+ m_close(p_pony);
return;
}
@@ -495,13 +495,13 @@ mfa_drain_query(struct mfa_query *q)
m_close(&proc->mproc);
}
- m_create(p_smtp, IMSG_MFA_SMTP_RESPONSE, 0, 0, -1);
- m_add_id(p_smtp, q->session->id);
- m_add_int(p_smtp, q->smtp.status);
- m_add_u32(p_smtp, q->smtp.code);
+ m_create(p_pony, IMSG_MFA_SMTP_RESPONSE, 0, 0, -1);
+ m_add_id(p_pony, q->session->id);
+ m_add_int(p_pony, q->smtp.status);
+ m_add_u32(p_pony, q->smtp.code);
if (q->smtp.response)
- m_add_string(p_smtp, q->smtp.response);
- m_close(p_smtp);
+ m_add_string(p_pony, q->smtp.response);
+ m_close(p_pony);
free(q->smtp.response);
}
diff --git a/usr.sbin/smtpd/mta.c b/usr.sbin/smtpd/mta.c
index cf73aea011b..f3ad4f12f27 100644
--- a/usr.sbin/smtpd/mta.c
+++ b/usr.sbin/smtpd/mta.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta.c,v 1.184 2014/03/08 15:47:52 eric Exp $ */
+/* $OpenBSD: mta.c,v 1.185 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -56,10 +56,6 @@
#define RELAY_ONHOLD 0x01
#define RELAY_HOLDQ 0x02
-static void mta_imsg(struct mproc *, struct imsg *);
-static void mta_shutdown(void);
-static void mta_sig_handler(int, short, void *);
-
static void mta_query_mx(struct mta_relay *);
static void mta_query_secret(struct mta_relay *);
static void mta_query_preference(struct mta_relay *);
@@ -205,7 +201,7 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_QUEUE) {
switch (imsg->hdr.type) {
- case IMSG_MTA_TRANSFER:
+ case IMSG_QUEUE_TRANSFER:
m_msg(&m, imsg);
m_get_envelope(&m, &evp);
m_end(&m);
@@ -227,7 +223,7 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
*/
if (relay->state & RELAY_ONHOLD) {
relay->state |= RELAY_HOLDQ;
- m_create(p_queue, IMSG_DELIVERY_HOLD, 0, 0, -1);
+ m_create(p_queue, IMSG_MTA_DELIVERY_HOLD, 0, 0, -1);
m_add_evpid(p_queue, evp.id);
m_add_id(p_queue, relay->id);
m_close(p_queue);
@@ -287,7 +283,7 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
mta_relay_unref(relay); /* from here */
return;
- case IMSG_QUEUE_MESSAGE_FD:
+ case IMSG_MTA_OPEN_MESSAGE:
mta_session_imsg(p, imsg);
return;
}
@@ -296,7 +292,7 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_LKA) {
switch (imsg->hdr.type) {
- case IMSG_LKA_SECRET:
+ case IMSG_MTA_LOOKUP_CREDENTIALS:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &secret);
@@ -305,7 +301,7 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
mta_on_secret(relay, secret[0] ? secret : NULL);
return;
- case IMSG_LKA_SOURCE:
+ case IMSG_MTA_LOOKUP_SOURCE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &status);
@@ -318,11 +314,11 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
mta_source((struct sockaddr *)&ss) : NULL);
return;
- case IMSG_LKA_HELO:
+ case IMSG_MTA_LOOKUP_HELO:
mta_session_imsg(p, imsg);
return;
- case IMSG_DNS_HOST:
+ case IMSG_MTA_DNS_HOST:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_sockaddr(&m, (struct sockaddr*)&ss);
@@ -341,7 +337,7 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
TAILQ_INSERT_TAIL(&domain->mxs, mx, entry);
return;
- case IMSG_DNS_HOST_END:
+ case IMSG_MTA_DNS_HOST_END:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &dnserror);
@@ -364,7 +360,7 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
waitq_run(&domain->mxs, domain);
return;
- case IMSG_DNS_MX_PREFERENCE:
+ case IMSG_MTA_DNS_MX_PREFERENCE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &dnserror);
@@ -382,15 +378,15 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
mta_on_preference(relay, preference);
return;
- case IMSG_DNS_PTR:
+ case IMSG_MTA_DNS_PTR:
mta_session_imsg(p, imsg);
return;
- case IMSG_LKA_SSL_INIT:
+ case IMSG_MTA_SSL_INIT:
mta_session_imsg(p, imsg);
return;
- case IMSG_LKA_SSL_VERIFY:
+ case IMSG_MTA_SSL_VERIFY:
mta_session_imsg(p, imsg);
return;
}
@@ -562,61 +558,14 @@ mta_imsg(struct mproc *p, struct imsg *imsg)
errx(1, "mta_imsg: unexpected %s imsg", imsg_to_str(imsg->hdr.type));
}
-static void
-mta_sig_handler(int sig, short event, void *p)
-{
- switch (sig) {
- case SIGINT:
- case SIGTERM:
- mta_shutdown();
- break;
- default:
- fatalx("mta_sig_handler: unexpected signal");
- }
-}
-
-static void
-mta_shutdown(void)
+void
+mta_postfork(void)
{
- log_info("info: mail transfer agent exiting");
- _exit(0);
}
-pid_t
-mta(void)
+void
+mta_postprivdrop(void)
{
- pid_t pid;
- struct passwd *pw;
- struct event ev_sigint;
- struct event ev_sigterm;
-
- switch (pid = fork()) {
- case -1:
- fatal("mta: cannot fork");
- case 0:
- post_fork(PROC_MTA);
- break;
- default:
- return (pid);
- }
-
- purge_config(PURGE_EVERYTHING);
-
- if ((pw = getpwnam(SMTPD_USER)) == NULL)
- fatalx("unknown user " SMTPD_USER);
-
- if (chroot(PATH_CHROOT) == -1)
- fatal("mta: chroot");
- if (chdir("/") == -1)
- fatal("mta: chdir(\"/\")");
-
- config_process(PROC_MTA);
-
- if (setgroups(1, &pw->pw_gid) ||
- setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
- setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
- fatal("mta: cannot drop privileges");
-
SPLAY_INIT(&relays);
SPLAY_INIT(&domains);
SPLAY_INIT(&hosts);
@@ -631,36 +580,15 @@ mta(void)
tree_init(&flush_evp);
dict_init(&hoststat);
- imsg_callback = mta_imsg;
- event_init();
-
evtimer_set(&ev_flush_evp, mta_delivery_flush_event, NULL);
runq_init(&runq_relay, mta_on_timeout);
runq_init(&runq_connector, mta_on_timeout);
runq_init(&runq_route, mta_on_timeout);
runq_init(&runq_hoststat, mta_on_timeout);
-
- signal_set(&ev_sigint, SIGINT, mta_sig_handler, NULL);
- signal_set(&ev_sigterm, SIGTERM, mta_sig_handler, NULL);
- signal_add(&ev_sigint, NULL);
- signal_add(&ev_sigterm, NULL);
- signal(SIGPIPE, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
-
- config_peer(PROC_PARENT);
- config_peer(PROC_QUEUE);
- config_peer(PROC_LKA);
- config_peer(PROC_CONTROL);
- config_done();
-
- if (event_dispatch() < 0)
- fatal("event_dispatch");
- mta_shutdown();
-
- return (0);
}
+
/*
* Local error on the given source.
*/
@@ -763,14 +691,14 @@ mta_route_next_task(struct mta_relay *relay, struct mta_route *route)
relay->state &= ~RELAY_ONHOLD;
}
if (relay->state & RELAY_HOLDQ) {
- m_create(p_queue, IMSG_DELIVERY_RELEASE, 0, 0, -1);
+ m_create(p_queue, IMSG_MTA_HOLDQ_RELEASE, 0, 0, -1);
m_add_id(p_queue, relay->id);
m_add_int(p_queue, relay->limits->task_release);
m_close(p_queue);
}
}
else if (relay->ntask == 0 && relay->state & RELAY_HOLDQ) {
- m_create(p_queue, IMSG_DELIVERY_RELEASE, 0, 0, -1);
+ m_create(p_queue, IMSG_MTA_HOLDQ_RELEASE, 0, 0, -1);
m_add_id(p_queue, relay->id);
m_add_int(p_queue, 0);
m_close(p_queue);
@@ -788,17 +716,30 @@ mta_delivery_flush_event(int fd, short event, void *arg)
if (tree_poproot(&flush_evp, NULL, (void**)(&e))) {
- if (e->delivery == IMSG_DELIVERY_OK) {
- m_create(p_queue, IMSG_DELIVERY_OK, 0, 0, -1);
+ if (e->delivery == IMSG_MTA_DELIVERY_OK) {
+ m_create(p_queue, IMSG_MTA_DELIVERY_OK, 0, 0, -1);
m_add_evpid(p_queue, e->id);
m_add_int(p_queue, e->ext);
m_close(p_queue);
- } else if (e->delivery == IMSG_DELIVERY_TEMPFAIL)
- queue_tempfail(e->id, e->status, ESC_OTHER_STATUS);
- else if (e->delivery == IMSG_DELIVERY_PERMFAIL)
- queue_permfail(e->id, e->status, ESC_OTHER_STATUS);
- else if (e->delivery == IMSG_DELIVERY_LOOP)
- queue_loop(e->id);
+ } else if (e->delivery == IMSG_MTA_DELIVERY_TEMPFAIL) {
+ m_create(p_queue, IMSG_MTA_DELIVERY_TEMPFAIL, 0, 0, -1);
+ m_add_evpid(p_queue, e->id);
+ m_add_string(p_queue, e->status);
+ m_add_int(p_queue, ESC_OTHER_STATUS);
+ m_close(p_queue);
+ }
+ else if (e->delivery == IMSG_MTA_DELIVERY_PERMFAIL) {
+ m_create(p_queue, IMSG_MTA_DELIVERY_PERMFAIL, 0, 0, -1);
+ m_add_evpid(p_queue, e->id);
+ m_add_string(p_queue, e->status);
+ m_add_int(p_queue, ESC_OTHER_STATUS);
+ m_close(p_queue);
+ }
+ else if (e->delivery == IMSG_MTA_DELIVERY_LOOP) {
+ m_create(p_queue, IMSG_MTA_DELIVERY_LOOP, 0, 0, -1);
+ m_add_evpid(p_queue, e->id);
+ m_close(p_queue);
+ }
else {
log_warnx("warn: bad delivery type %i for %016" PRIx64,
e->delivery, e->id);
@@ -822,13 +763,13 @@ void
mta_delivery_log(struct mta_envelope *e, const char *source, const char *relay,
int delivery, const char *status)
{
- if (delivery == IMSG_DELIVERY_OK)
+ if (delivery == IMSG_MTA_DELIVERY_OK)
mta_log(e, "Ok", source, relay, status);
- else if (delivery == IMSG_DELIVERY_TEMPFAIL)
+ else if (delivery == IMSG_MTA_DELIVERY_TEMPFAIL)
mta_log(e, "TempFail", source, relay, status);
- else if (delivery == IMSG_DELIVERY_PERMFAIL)
+ else if (delivery == IMSG_MTA_DELIVERY_PERMFAIL)
mta_log(e, "PermFail", source, relay, status);
- else if (delivery == IMSG_DELIVERY_LOOP)
+ else if (delivery == IMSG_MTA_DELIVERY_LOOP)
mta_log(e, "PermFail", source, relay, "Loop detected");
else {
log_warnx("warn: bad delivery type %i for %016" PRIx64,
@@ -869,9 +810,12 @@ mta_query_mx(struct mta_relay *relay)
id = generate_uid();
tree_xset(&wait_mx, id, relay->domain);
if (relay->domain->flags)
- dns_query_host(id, relay->domain->name);
+ m_create(p_lka, IMSG_MTA_DNS_HOST, 0, 0, -1);
else
- dns_query_mx(id, relay->domain->name);
+ m_create(p_lka, IMSG_MTA_DNS_MX, 0, 0, -1);
+ m_add_id(p_lka, id);
+ m_add_string(p_lka, relay->domain->name);
+ m_close(p_lka);
}
relay->status |= RELAY_WAIT_MX;
mta_relay_ref(relay);
@@ -905,7 +849,7 @@ mta_query_secret(struct mta_relay *relay)
tree_xset(&wait_secret, relay->id, relay);
relay->status |= RELAY_WAIT_SECRET;
- m_create(p_lka, IMSG_LKA_SECRET, 0, 0, -1);
+ m_create(p_lka, IMSG_MTA_LOOKUP_CREDENTIALS, 0, 0, -1);
m_add_id(p_lka, relay->id);
m_add_string(p_lka, relay->authtable);
m_add_string(p_lka, relay->authlabel);
@@ -925,8 +869,13 @@ mta_query_preference(struct mta_relay *relay)
tree_xset(&wait_preference, relay->id, relay);
relay->status |= RELAY_WAIT_PREFERENCE;
- dns_query_mx_preference(relay->id, relay->domain->name,
- relay->backupname);
+
+ m_create(p_lka, IMSG_MTA_DNS_MX_PREFERENCE, 0, 0, -1);
+ m_add_id(p_lka, relay->id);
+ m_add_string(p_lka, relay->domain->name);
+ m_add_string(p_lka, relay->backupname);
+ m_close(p_lka);
+
mta_relay_ref(relay);
}
@@ -948,7 +897,7 @@ mta_query_source(struct mta_relay *relay)
return;
}
- m_create(p_lka, IMSG_LKA_SOURCE, 0, 0, -1);
+ m_create(p_lka, IMSG_MTA_LOOKUP_SOURCE, 0, 0, -1);
m_add_id(p_lka, relay->id);
m_add_string(p_lka, relay->sourcetable);
m_close(p_lka);
@@ -971,19 +920,19 @@ mta_on_mx(void *tag, void *arg, void *data)
case DNS_OK:
break;
case DNS_RETRY:
- relay->fail = IMSG_DELIVERY_TEMPFAIL;
+ relay->fail = IMSG_MTA_DELIVERY_TEMPFAIL;
relay->failstr = "Temporary failure in MX lookup";
break;
case DNS_EINVAL:
- relay->fail = IMSG_DELIVERY_PERMFAIL;
+ relay->fail = IMSG_MTA_DELIVERY_PERMFAIL;
relay->failstr = "Invalid domain name";
break;
case DNS_ENONAME:
- relay->fail = IMSG_DELIVERY_PERMFAIL;
+ relay->fail = IMSG_MTA_DELIVERY_PERMFAIL;
relay->failstr = "Domain does not exist";
break;
case DNS_ENOTFOUND:
- relay->fail = IMSG_DELIVERY_TEMPFAIL;
+ relay->fail = IMSG_MTA_DELIVERY_TEMPFAIL;
relay->failstr = "No MX found for domain";
break;
default:
@@ -1012,7 +961,7 @@ mta_on_secret(struct mta_relay *relay, const char *secret)
if (relay->secret == NULL) {
log_warnx("warn: Failed to retrieve secret "
"for %s", mta_relay_to_text(relay));
- relay->fail = IMSG_DELIVERY_TEMPFAIL;
+ relay->fail = IMSG_MTA_DELIVERY_TEMPFAIL;
relay->failstr = "Could not retrieve credentials";
}
@@ -1066,11 +1015,11 @@ mta_on_source(struct mta_relay *relay, struct mta_source *source)
}
if (tree_count(&relay->connectors) == 0) {
- relay->fail = IMSG_DELIVERY_TEMPFAIL;
+ relay->fail = IMSG_MTA_DELIVERY_TEMPFAIL;
relay->failstr = "Could not retrieve source address";
}
if (tree_count(&relay->connectors) < relay->sourceloop) {
- relay->fail = IMSG_DELIVERY_TEMPFAIL;
+ relay->fail = IMSG_MTA_DELIVERY_TEMPFAIL;
relay->failstr = "No valid route to remote MX";
errmask = 0;
@@ -1411,7 +1360,7 @@ mta_flush(struct mta_relay *relay, int fail, const char *error)
log_debug("debug: mta_flush(%s, %d, \"%s\")",
mta_relay_to_text(relay), fail, error);
- if (fail != IMSG_DELIVERY_TEMPFAIL && fail != IMSG_DELIVERY_PERMFAIL)
+ if (fail != IMSG_MTA_DELIVERY_TEMPFAIL && fail != IMSG_MTA_DELIVERY_PERMFAIL)
errx(1, "unexpected delivery status %d", fail);
n = 0;
@@ -1426,7 +1375,7 @@ mta_flush(struct mta_relay *relay, int fail, const char *error)
* that domain.
*/
domain = strchr(e->dest, '@');
- if (fail == IMSG_DELIVERY_TEMPFAIL && domain) {
+ if (fail == IMSG_MTA_DELIVERY_TEMPFAIL && domain) {
r = 0;
iter = NULL;
while (tree_iter(&relay->connectors, &iter,
@@ -1453,7 +1402,7 @@ mta_flush(struct mta_relay *relay, int fail, const char *error)
/* release all waiting envelopes for the relay */
if (relay->state & RELAY_HOLDQ) {
- m_create(p_queue, IMSG_DELIVERY_RELEASE, 0, 0, -1);
+ m_create(p_queue, IMSG_MTA_HOLDQ_RELEASE, 0, 0, -1);
m_add_id(p_queue, relay->id);
m_add_int(p_queue, -1);
m_close(p_queue);
@@ -1760,7 +1709,7 @@ mta_relay_unref(struct mta_relay *relay)
/* Make sure they are no envelopes held for this relay */
if (relay->state & RELAY_HOLDQ) {
- m_create(p_queue, IMSG_DELIVERY_RELEASE, 0, 0, -1);
+ m_create(p_queue, IMSG_MTA_HOLDQ_RELEASE, 0, 0, -1);
m_add_id(p_queue, relay->id);
m_add_int(p_queue, 0);
m_close(p_queue);
diff --git a/usr.sbin/smtpd/mta_session.c b/usr.sbin/smtpd/mta_session.c
index 60cef17c941..8f304cad319 100644
--- a/usr.sbin/smtpd/mta_session.c
+++ b/usr.sbin/smtpd/mta_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta_session.c,v 1.57 2014/03/02 21:19:36 gilles Exp $ */
+/* $OpenBSD: mta_session.c,v 1.58 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -231,7 +231,10 @@ mta_session(struct mta_relay *relay, struct mta_route *route)
evtimer_set(&s->io.ev, mta_start, s);
evtimer_add(&s->io.ev, &tv);
} else if (waitq_wait(&route->dst->ptrname, mta_on_ptr, s)) {
- dns_query_ptr(s->id, s->route->dst->sa);
+ m_create(p_lka, IMSG_MTA_DNS_PTR, 0, 0, -1);
+ m_add_id(p_lka, s->id);
+ m_add_sockaddr(p_lka, s->route->dst->sa);
+ m_close(p_lka);
tree_xset(&wait_ptr, s->id, s);
s->flags |= MTA_WAIT;
}
@@ -252,7 +255,7 @@ mta_session_imsg(struct mproc *p, struct imsg *imsg)
switch (imsg->hdr.type) {
- case IMSG_QUEUE_MESSAGE_FD:
+ case IMSG_MTA_OPEN_MESSAGE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
@@ -266,7 +269,7 @@ mta_session_imsg(struct mproc *p, struct imsg *imsg)
if (imsg->fd == -1) {
log_debug("debug: mta: failed to obtain msg fd");
- mta_flush_task(s, IMSG_DELIVERY_TEMPFAIL,
+ mta_flush_task(s, IMSG_MTA_DELIVERY_TEMPFAIL,
"Could not get message fd", 0, 0);
mta_enter_state(s, MTA_READY);
io_reload(&s->io);
@@ -281,7 +284,7 @@ mta_session_imsg(struct mproc *p, struct imsg *imsg)
log_debug("debug: mta: loop detected");
fclose(s->datafp);
s->datafp = NULL;
- mta_flush_task(s, IMSG_DELIVERY_LOOP,
+ mta_flush_task(s, IMSG_MTA_DELIVERY_LOOP,
"Loop detected", 0, 0);
mta_enter_state(s, MTA_READY);
} else {
@@ -290,7 +293,7 @@ mta_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_DNS_PTR:
+ case IMSG_MTA_DNS_PTR:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &dnserror);
@@ -310,7 +313,7 @@ mta_session_imsg(struct mproc *p, struct imsg *imsg)
waitq_run(&h->ptrname, h->ptrname);
return;
- case IMSG_LKA_SSL_INIT:
+ case IMSG_MTA_SSL_INIT:
resp_ca_cert = imsg->data;
s = mta_tree_pop(&wait_ssl_init, resp_ca_cert->reqid);
if (s == NULL)
@@ -351,7 +354,7 @@ mta_session_imsg(struct mproc *p, struct imsg *imsg)
free(resp_ca_cert);
return;
- case IMSG_LKA_SSL_VERIFY:
+ case IMSG_MTA_SSL_VERIFY:
resp_ca_vrfy = imsg->data;
s = mta_tree_pop(&wait_ssl_verify, resp_ca_vrfy->reqid);
if (s == NULL)
@@ -371,7 +374,7 @@ mta_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_LKA_HELO:
+ case IMSG_MTA_LOOKUP_HELO:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &status);
@@ -488,7 +491,7 @@ mta_connect(struct mta_session *s)
if (s->helo == NULL) {
if (s->relay->helotable && s->route->src->sa) {
- m_create(p_lka, IMSG_LKA_HELO, 0, 0, -1);
+ m_create(p_lka, IMSG_MTA_LOOKUP_HELO, 0, 0, -1);
m_add_id(p_lka, s->id);
m_add_string(p_lka, s->relay->helotable);
m_add_sockaddr(p_lka, s->route->src->sa);
@@ -754,7 +757,7 @@ mta_enter_state(struct mta_session *s, int newstate)
stat_increment("mta.task.running", 1);
- m_create(p_queue, IMSG_QUEUE_MESSAGE_FD, 0, 0, -1);
+ m_create(p_queue, IMSG_MTA_OPEN_MESSAGE, 0, 0, -1);
m_add_id(p_queue, s->id);
m_add_msgid(p_queue, s->task->msgid);
m_close(p_queue);
@@ -963,9 +966,9 @@ mta_response(struct mta_session *s, char *line)
case MTA_MAIL:
if (line[0] != '2') {
if (line[0] == '5')
- delivery = IMSG_DELIVERY_PERMFAIL;
+ delivery = IMSG_MTA_DELIVERY_PERMFAIL;
else
- delivery = IMSG_DELIVERY_TEMPFAIL;
+ delivery = IMSG_MTA_DELIVERY_TEMPFAIL;
mta_flush_task(s, delivery, line, 0, 0);
mta_enter_state(s, MTA_RSET);
return;
@@ -994,9 +997,9 @@ mta_response(struct mta_session *s, char *line)
}
else {
if (line[0] == '5')
- delivery = IMSG_DELIVERY_PERMFAIL;
+ delivery = IMSG_MTA_DELIVERY_PERMFAIL;
else
- delivery = IMSG_DELIVERY_TEMPFAIL;
+ delivery = IMSG_MTA_DELIVERY_TEMPFAIL;
s->failures++;
/* remove failed envelope from task list */
@@ -1027,7 +1030,7 @@ mta_response(struct mta_session *s, char *line)
if (s->relay->limits->max_failures_per_session &&
s->failures == s->relay->limits->max_failures_per_session) {
- mta_flush_task(s, IMSG_DELIVERY_TEMPFAIL,
+ mta_flush_task(s, IMSG_MTA_DELIVERY_TEMPFAIL,
"Too many consecutive errors, closing connection", 0, 1);
mta_enter_state(s, MTA_QUIT);
break;
@@ -1037,7 +1040,7 @@ mta_response(struct mta_session *s, char *line)
* if no more envelopes, flush failed queue
*/
if (TAILQ_EMPTY(&s->task->envelopes)) {
- mta_flush_task(s, IMSG_DELIVERY_OK,
+ mta_flush_task(s, IMSG_MTA_DELIVERY_OK,
"No envelope", 0, 0);
mta_enter_state(s, MTA_RSET);
break;
@@ -1056,9 +1059,9 @@ mta_response(struct mta_session *s, char *line)
break;
}
if (line[0] == '5')
- delivery = IMSG_DELIVERY_PERMFAIL;
+ delivery = IMSG_MTA_DELIVERY_PERMFAIL;
else
- delivery = IMSG_DELIVERY_TEMPFAIL;
+ delivery = IMSG_MTA_DELIVERY_TEMPFAIL;
mta_flush_task(s, delivery, line, 0, 0);
mta_enter_state(s, MTA_RSET);
break;
@@ -1066,14 +1069,14 @@ mta_response(struct mta_session *s, char *line)
case MTA_LMTP_EOM:
case MTA_EOM:
if (line[0] == '2') {
- delivery = IMSG_DELIVERY_OK;
+ delivery = IMSG_MTA_DELIVERY_OK;
s->msgtried = 0;
s->msgcount++;
}
else if (line[0] == '5')
- delivery = IMSG_DELIVERY_PERMFAIL;
+ delivery = IMSG_MTA_DELIVERY_PERMFAIL;
else
- delivery = IMSG_DELIVERY_TEMPFAIL;
+ delivery = IMSG_MTA_DELIVERY_TEMPFAIL;
mta_flush_task(s, delivery, line, (s->flags & MTA_LMTP) ? 1 : 0, 0);
if (s->task) {
s->rcptcount--;
@@ -1325,7 +1328,7 @@ mta_queue_data(struct mta_session *s)
}
if (ferror(s->datafp)) {
- mta_flush_task(s, IMSG_DELIVERY_TEMPFAIL,
+ mta_flush_task(s, IMSG_MTA_DELIVERY_TEMPFAIL,
"Error reading content file", 0, 0);
return (-1);
}
@@ -1438,7 +1441,7 @@ mta_error(struct mta_session *s, const char *fmt, ...)
mta_route_error(s->relay, s->route);
if (s->task)
- mta_flush_task(s, IMSG_DELIVERY_TEMPFAIL, error, 0, 0);
+ mta_flush_task(s, IMSG_MTA_DELIVERY_TEMPFAIL, error, 0, 0);
free(error);
}
@@ -1498,7 +1501,7 @@ mta_start_tls(struct mta_session *s)
req_ca_cert.reqid = s->id;
strlcpy(req_ca_cert.name, certname, sizeof req_ca_cert.name);
- m_compose(p_lka, IMSG_LKA_SSL_INIT, 0, 0, -1,
+ m_compose(p_lka, IMSG_MTA_SSL_INIT, 0, 0, -1,
&req_ca_cert, sizeof(req_ca_cert));
tree_xset(&wait_ssl_init, s->id, s);
s->flags |= MTA_WAIT;
@@ -1549,7 +1552,7 @@ mta_verify_certificate(struct mta_session *s)
iov[0].iov_len = sizeof(req_ca_vrfy);
iov[1].iov_base = req_ca_vrfy.cert;
iov[1].iov_len = req_ca_vrfy.cert_len;
- m_composev(p_lka, IMSG_LKA_SSL_VERIFY_CERT, 0, 0, -1,
+ m_composev(p_lka, IMSG_MTA_SSL_VERIFY_CERT, 0, 0, -1,
iov, nitems(iov));
free(req_ca_vrfy.cert);
X509_free(x);
@@ -1565,7 +1568,7 @@ mta_verify_certificate(struct mta_session *s)
iov[0].iov_len = sizeof(req_ca_vrfy);
iov[1].iov_base = req_ca_vrfy.cert;
iov[1].iov_len = req_ca_vrfy.cert_len;
- m_composev(p_lka, IMSG_LKA_SSL_VERIFY_CHAIN, 0, 0, -1,
+ m_composev(p_lka, IMSG_MTA_SSL_VERIFY_CHAIN, 0, 0, -1,
iov, nitems(iov));
free(req_ca_vrfy.cert);
}
@@ -1574,7 +1577,7 @@ mta_verify_certificate(struct mta_session *s)
/* Tell lookup process that it can start verifying, we're done */
memset(&req_ca_vrfy, 0, sizeof req_ca_vrfy);
req_ca_vrfy.reqid = s->id;
- m_compose(p_lka, IMSG_LKA_SSL_VERIFY, 0, 0, -1,
+ m_compose(p_lka, IMSG_MTA_SSL_VERIFY, 0, 0, -1,
&req_ca_vrfy, sizeof req_ca_vrfy);
return 1;
diff --git a/usr.sbin/smtpd/pony.c b/usr.sbin/smtpd/pony.c
new file mode 100644
index 00000000000..1f23cf235f8
--- /dev/null
+++ b/usr.sbin/smtpd/pony.c
@@ -0,0 +1,222 @@
+/* $OpenBSD: pony.c,v 1.1 2014/04/04 16:10:42 eric Exp $ */
+
+/*
+ * Copyright (c) 2014 Gilles Chehade <gilles@poolp.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 <sys/queue.h>
+#include <sys/tree.h>
+#include <sys/socket.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <event.h>
+#include <imsg.h>
+#include <inttypes.h>
+#include <pwd.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <vis.h>
+
+#include "smtpd.h"
+#include "log.h"
+
+void mda_imsg(struct mproc *, struct imsg *);
+void mta_imsg(struct mproc *, struct imsg *);
+void smtp_imsg(struct mproc *, struct imsg *);
+
+static void pony_imsg(struct mproc *, struct imsg *);
+static void pony_shutdown(void);
+static void pony_sig_handler(int, short, void *);
+
+static void
+pony_imsg(struct mproc *p, struct imsg *imsg)
+{
+ struct msg m;
+ int v;
+
+ switch (imsg->hdr.type) {
+ case IMSG_CONF_START:
+ return;
+ case IMSG_CONF_END:
+ smtp_configure();
+ return;
+ case IMSG_CTL_VERBOSE:
+ m_msg(&m, imsg);
+ m_get_int(&m, &v);
+ m_end(&m);
+ log_verbose(v);
+ return;
+ case IMSG_CTL_PROFILE:
+ m_msg(&m, imsg);
+ m_get_int(&m, &v);
+ m_end(&m);
+ profiling = v;
+ return;
+
+ /* smtp imsg */
+ case IMSG_SMTP_DNS_PTR:
+ case IMSG_SMTP_EXPAND_RCPT:
+ case IMSG_SMTP_LOOKUP_HELO:
+ case IMSG_SMTP_AUTHENTICATE:
+ case IMSG_SMTP_SSL_INIT:
+ case IMSG_SMTP_SSL_VERIFY:
+ case IMSG_MFA_SMTP_RESPONSE:
+ case IMSG_SMTP_MESSAGE_COMMIT:
+ case IMSG_SMTP_MESSAGE_CREATE:
+ case IMSG_SMTP_MESSAGE_OPEN:
+ case IMSG_QUEUE_ENVELOPE_SUBMIT:
+ case IMSG_QUEUE_ENVELOPE_COMMIT:
+ case IMSG_QUEUE_SMTP_SESSION:
+ case IMSG_CTL_SMTP_SESSION:
+ case IMSG_CTL_PAUSE_SMTP:
+ case IMSG_CTL_RESUME_SMTP:
+ smtp_imsg(p, imsg);
+ return;
+
+ /* mta imsg */
+ case IMSG_QUEUE_TRANSFER:
+ case IMSG_MTA_OPEN_MESSAGE:
+ case IMSG_MTA_LOOKUP_CREDENTIALS:
+ case IMSG_MTA_LOOKUP_SOURCE:
+ case IMSG_MTA_LOOKUP_HELO:
+ case IMSG_MTA_DNS_HOST:
+ case IMSG_MTA_DNS_HOST_END:
+ case IMSG_MTA_DNS_MX_PREFERENCE:
+ case IMSG_MTA_DNS_PTR:
+ case IMSG_MTA_SSL_INIT:
+ case IMSG_MTA_SSL_VERIFY:
+ case IMSG_CTL_RESUME_ROUTE:
+ case IMSG_CTL_MTA_SHOW_HOSTS:
+ case IMSG_CTL_MTA_SHOW_RELAYS:
+ case IMSG_CTL_MTA_SHOW_ROUTES:
+ case IMSG_CTL_MTA_SHOW_HOSTSTATS:
+ case IMSG_CTL_MTA_BLOCK:
+ case IMSG_CTL_MTA_UNBLOCK:
+ case IMSG_CTL_MTA_SHOW_BLOCK:
+ mta_imsg(p, imsg);
+ return;
+
+ /* mda imsg */
+ case IMSG_MDA_LOOKUP_USERINFO:
+ case IMSG_QUEUE_DELIVER:
+ case IMSG_MDA_OPEN_MESSAGE:
+ case IMSG_MDA_FORK:
+ case IMSG_MDA_DONE:
+ mda_imsg(p, imsg);
+ return;
+ default:
+ break;
+ }
+
+ errx(1, "session_imsg: unexpected %s imsg", imsg_to_str(imsg->hdr.type));
+}
+
+static void
+pony_sig_handler(int sig, short event, void *p)
+{
+ switch (sig) {
+ case SIGINT:
+ case SIGTERM:
+ pony_shutdown();
+ break;
+ default:
+ fatalx("pony_sig_handler: unexpected signal");
+ }
+}
+
+static void
+pony_shutdown(void)
+{
+ log_info("info: pony agent exiting");
+ _exit(0);
+}
+
+pid_t
+pony(void)
+{
+ pid_t pid;
+ struct passwd *pw;
+ struct event ev_sigint;
+ struct event ev_sigterm;
+
+ switch (pid = fork()) {
+ case -1:
+ fatal("pony: cannot fork");
+ case 0:
+ post_fork(PROC_PONY);
+ break;
+ default:
+ return (pid);
+ }
+
+ mda_postfork();
+ mta_postfork();
+ smtp_postfork();
+
+ /* do not purge listeners and pki, they are purged
+ * in smtp_configure()
+ */
+ purge_config(PURGE_TABLES|PURGE_RULES);
+
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
+
+ if (chroot(PATH_CHROOT) == -1)
+ fatal("pony: chroot");
+ if (chdir("/") == -1)
+ fatal("pony: chdir(\"/\")");
+
+ config_process(PROC_PONY);
+
+ if (setgroups(1, &pw->pw_gid) ||
+ setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
+ setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
+ fatal("pony: cannot drop privileges");
+
+
+ imsg_callback = pony_imsg;
+ event_init();
+
+ mda_postprivdrop();
+ mta_postprivdrop();
+ smtp_postprivdrop();
+
+ signal_set(&ev_sigint, SIGINT, pony_sig_handler, NULL);
+ signal_set(&ev_sigterm, SIGTERM, pony_sig_handler, NULL);
+ signal_add(&ev_sigint, NULL);
+ signal_add(&ev_sigterm, NULL);
+ signal(SIGPIPE, SIG_IGN);
+ signal(SIGHUP, SIG_IGN);
+
+ config_peer(PROC_PARENT);
+ config_peer(PROC_QUEUE);
+ config_peer(PROC_LKA);
+ config_peer(PROC_CONTROL);
+ config_peer(PROC_MFA);
+ config_done();
+
+ if (event_dispatch() < 0)
+ fatal("event_dispatch");
+ pony_shutdown();
+
+ return (0);
+}
diff --git a/usr.sbin/smtpd/queue.c b/usr.sbin/smtpd/queue.c
index 51173e9302d..d1cdd7f39aa 100644
--- a/usr.sbin/smtpd/queue.c
+++ b/usr.sbin/smtpd/queue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: queue.c,v 1.159 2014/02/04 15:44:05 eric Exp $ */
+/* $OpenBSD: queue.c,v 1.160 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -71,17 +71,17 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
int fd, mta_ext, ret, v, flags, code;
memset(&bounce, 0, sizeof(struct delivery_bounce));
- if (p->proc == PROC_SMTP) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_QUEUE_CREATE_MESSAGE:
+ case IMSG_SMTP_MESSAGE_CREATE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
ret = queue_message_create(&msgid);
- m_create(p, IMSG_QUEUE_CREATE_MESSAGE, 0, 0, -1);
+ m_create(p, IMSG_SMTP_MESSAGE_CREATE, 0, 0, -1);
m_add_id(p, reqid);
if (ret == 0)
m_add_int(p, 0);
@@ -92,20 +92,20 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
m_close(p);
return;
- case IMSG_QUEUE_REMOVE_MESSAGE:
+ case IMSG_SMTP_MESSAGE_ROLLBACK:
m_msg(&m, imsg);
m_get_msgid(&m, &msgid);
m_end(&m);
queue_message_delete(msgid);
- m_create(p_scheduler, IMSG_QUEUE_REMOVE_MESSAGE,
+ m_create(p_scheduler, IMSG_QUEUE_MESSAGE_ROLLBACK,
0, 0, -1);
m_add_msgid(p_scheduler, msgid);
m_close(p_scheduler);
return;
- case IMSG_QUEUE_COMMIT_MESSAGE:
+ case IMSG_SMTP_MESSAGE_COMMIT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_msgid(&m, &msgid);
@@ -113,20 +113,20 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
ret = queue_message_commit(msgid);
- m_create(p, IMSG_QUEUE_COMMIT_MESSAGE, 0, 0, -1);
+ m_create(p, IMSG_SMTP_MESSAGE_COMMIT, 0, 0, -1);
m_add_id(p, reqid);
m_add_int(p, (ret == 0) ? 0 : 1);
m_close(p);
if (ret) {
- m_create(p_scheduler, IMSG_QUEUE_COMMIT_MESSAGE,
+ m_create(p_scheduler, IMSG_QUEUE_MESSAGE_COMMIT,
0, 0, -1);
m_add_msgid(p_scheduler, msgid);
m_close(p_scheduler);
}
return;
- case IMSG_QUEUE_MESSAGE_FILE:
+ case IMSG_SMTP_MESSAGE_OPEN:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_msgid(&m, &msgid);
@@ -134,13 +134,13 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
fd = queue_message_fd_rw(msgid);
- m_create(p, IMSG_QUEUE_MESSAGE_FILE, 0, 0, fd);
+ m_create(p, IMSG_SMTP_MESSAGE_OPEN, 0, 0, fd);
m_add_id(p, reqid);
m_add_int(p, (fd == -1) ? 0 : 1);
m_close(p);
return;
- case IMSG_SMTP_ENQUEUE_FD:
+ case IMSG_QUEUE_SMTP_SESSION:
bounce_fd(imsg->fd);
return;
}
@@ -148,7 +148,7 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_LKA) {
switch (imsg->hdr.type) {
- case IMSG_QUEUE_SUBMIT_ENVELOPE:
+ case IMSG_LKA_ENVELOPE_SUBMIT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_envelope(&m, &evp);
@@ -160,39 +160,39 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
log_warnx("warn: imsg_queue_submit_envelope: msgid=0, "
"evpid=%016"PRIx64, evp.id);
ret = queue_envelope_create(&evp);
- m_create(p_smtp, IMSG_QUEUE_SUBMIT_ENVELOPE, 0, 0, -1);
- m_add_id(p_smtp, reqid);
+ m_create(p_pony, IMSG_QUEUE_ENVELOPE_SUBMIT, 0, 0, -1);
+ m_add_id(p_pony, reqid);
if (ret == 0)
- m_add_int(p_smtp, 0);
+ m_add_int(p_pony, 0);
else {
- m_add_int(p_smtp, 1);
- m_add_evpid(p_smtp, evp.id);
+ m_add_int(p_pony, 1);
+ m_add_evpid(p_pony, evp.id);
}
- m_close(p_smtp);
+ m_close(p_pony);
if (ret) {
m_create(p_scheduler,
- IMSG_QUEUE_SUBMIT_ENVELOPE, 0, 0, -1);
+ IMSG_QUEUE_ENVELOPE_SUBMIT, 0, 0, -1);
m_add_envelope(p_scheduler, &evp);
m_close(p_scheduler);
}
return;
- case IMSG_QUEUE_COMMIT_ENVELOPES:
+ case IMSG_LKA_ENVELOPE_COMMIT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_end(&m);
- m_create(p_smtp, IMSG_QUEUE_COMMIT_ENVELOPES, 0, 0, -1);
- m_add_id(p_smtp, reqid);
- m_add_int(p_smtp, 1);
- m_close(p_smtp);
+ m_create(p_pony, IMSG_QUEUE_ENVELOPE_COMMIT, 0, 0, -1);
+ m_add_id(p_pony, reqid);
+ m_add_int(p_pony, 1);
+ m_close(p_pony);
return;
}
}
if (p->proc == PROC_SCHEDULER) {
switch (imsg->hdr.type) {
- case IMSG_QUEUE_REMOVE:
+ case IMSG_SCHED_ENVELOPE_REMOVE:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
@@ -204,7 +204,7 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
queue_envelope_delete(evpid);
return;
- case IMSG_QUEUE_EXPIRE:
+ case IMSG_SCHED_ENVELOPE_EXPIRE:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
@@ -222,13 +222,13 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
queue_envelope_delete(evpid);
return;
- case IMSG_QUEUE_BOUNCE:
+ case IMSG_SCHED_ENVELOPE_BOUNCE:
req_bounce = imsg->data;
evpid = req_bounce->evpid;
if (queue_envelope_load(evpid, &evp) == 0) {
log_warnx("queue: bounce: failed to load envelope");
- m_create(p_scheduler, IMSG_QUEUE_REMOVE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_REMOVE, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_add_u32(p_scheduler, 0); /* not in-flight */
m_close(p_scheduler);
@@ -240,47 +240,47 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
log_warnx("warn: could not update envelope %016"PRIx64, evpid);
return;
- case IMSG_MDA_DELIVER:
+ case IMSG_SCHED_ENVELOPE_DELIVER:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
if (queue_envelope_load(evpid, &evp) == 0) {
log_warnx("queue: deliver: failed to load envelope");
- m_create(p_scheduler, IMSG_QUEUE_REMOVE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_REMOVE, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_add_u32(p_scheduler, 1); /* in-flight */
m_close(p_scheduler);
return;
}
evp.lasttry = time(NULL);
- m_create(p_mda, IMSG_MDA_DELIVER, 0, 0, -1);
- m_add_envelope(p_mda, &evp);
- m_close(p_mda);
+ m_create(p_pony, IMSG_QUEUE_DELIVER, 0, 0, -1);
+ m_add_envelope(p_pony, &evp);
+ m_close(p_pony);
return;
- case IMSG_BOUNCE_INJECT:
+ case IMSG_SCHED_ENVELOPE_INJECT:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
bounce_add(evpid);
return;
- case IMSG_MTA_TRANSFER:
+ case IMSG_SCHED_ENVELOPE_TRANSFER:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
if (queue_envelope_load(evpid, &evp) == 0) {
log_warnx("queue: failed to load envelope");
- m_create(p_scheduler, IMSG_QUEUE_REMOVE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_REMOVE, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_add_u32(p_scheduler, 1); /* in-flight */
m_close(p_scheduler);
return;
}
evp.lasttry = time(NULL);
- m_create(p_mta, IMSG_MTA_TRANSFER, 0, 0, -1);
- m_add_envelope(p_mta, &evp);
- m_close(p_mta);
+ m_create(p_pony, IMSG_QUEUE_TRANSFER, 0, 0, -1);
+ m_add_envelope(p_pony, &evp);
+ m_close(p_pony);
return;
case IMSG_CTL_LIST_ENVELOPES:
@@ -320,23 +320,25 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
}
}
- if (p->proc == PROC_MTA || p->proc == PROC_MDA) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_QUEUE_MESSAGE_FD:
+ case IMSG_MDA_OPEN_MESSAGE:
+ case IMSG_MTA_OPEN_MESSAGE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_msgid(&m, &msgid);
m_end(&m);
fd = queue_message_fd_r(msgid);
- m_create(p, IMSG_QUEUE_MESSAGE_FD, 0, 0, fd);
+ m_create(p, imsg->hdr.type, 0, 0, fd);
m_add_id(p, reqid);
m_close(p);
return;
- case IMSG_DELIVERY_OK:
+ case IMSG_MDA_DELIVERY_OK:
+ case IMSG_MTA_DELIVERY_OK:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
- if (p->proc == PROC_MTA)
+ if (imsg->hdr.type == IMSG_MTA_DELIVERY_OK)
m_get_int(&m, &mta_ext);
m_end(&m);
if (queue_envelope_load(evpid, &evp) == 0) {
@@ -347,21 +349,22 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
bounce.type = B_DSN;
bounce.dsn_ret = evp.dsn_ret;
- if (p->proc == PROC_MDA)
+ if (imsg->hdr.type == IMSG_MDA_DELIVERY_OK)
queue_bounce(&evp, &bounce);
- else if (p->proc == PROC_MTA &&
+ else if (imsg->hdr.type == IMSG_MTA_DELIVERY_OK &&
(mta_ext & MTA_EXT_DSN) == 0) {
bounce.mta_without_dsn = 1;
queue_bounce(&evp, &bounce);
}
}
queue_envelope_delete(evpid);
- m_create(p_scheduler, IMSG_DELIVERY_OK, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_DELIVERY_OK, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_close(p_scheduler);
return;
- case IMSG_DELIVERY_TEMPFAIL:
+ case IMSG_MDA_DELIVERY_TEMPFAIL:
+ case IMSG_MTA_DELIVERY_TEMPFAIL:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_get_string(&m, &reason);
@@ -369,7 +372,7 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
m_end(&m);
if (queue_envelope_load(evpid, &evp) == 0) {
log_warnx("queue: tempfail: failed to load envelope");
- m_create(p_scheduler, IMSG_QUEUE_REMOVE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_REMOVE, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_add_u32(p_scheduler, 1); /* in-flight */
m_close(p_scheduler);
@@ -381,12 +384,13 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
evp.retry++;
if (!queue_envelope_update(&evp))
log_warnx("warn: could not update envelope %016"PRIx64, evpid);
- m_create(p_scheduler, IMSG_DELIVERY_TEMPFAIL, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_DELIVERY_TEMPFAIL, 0, 0, -1);
m_add_envelope(p_scheduler, &evp);
m_close(p_scheduler);
return;
- case IMSG_DELIVERY_PERMFAIL:
+ case IMSG_MDA_DELIVERY_PERMFAIL:
+ case IMSG_MTA_DELIVERY_PERMFAIL:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_get_string(&m, &reason);
@@ -394,7 +398,7 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
m_end(&m);
if (queue_envelope_load(evpid, &evp) == 0) {
log_warnx("queue: permfail: failed to load envelope");
- m_create(p_scheduler, IMSG_QUEUE_REMOVE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_REMOVE, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_add_u32(p_scheduler, 1); /* in-flight */
m_close(p_scheduler);
@@ -406,18 +410,19 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
envelope_set_esc_code(&evp, code);
queue_bounce(&evp, &bounce);
queue_envelope_delete(evpid);
- m_create(p_scheduler, IMSG_DELIVERY_PERMFAIL, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_DELIVERY_PERMFAIL, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_close(p_scheduler);
return;
- case IMSG_DELIVERY_LOOP:
+ case IMSG_MDA_DELIVERY_LOOP:
+ case IMSG_MTA_DELIVERY_LOOP:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
if (queue_envelope_load(evpid, &evp) == 0) {
log_warnx("queue: loop: failed to load envelope");
- m_create(p_scheduler, IMSG_QUEUE_REMOVE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_REMOVE, 0, 0, -1);
m_add_evpid(p_scheduler, evpid);
m_add_u32(p_scheduler, 1); /* in-flight */
m_close(p_scheduler);
@@ -429,23 +434,30 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
bounce.type = B_ERROR;
queue_bounce(&evp, &bounce);
queue_envelope_delete(evp.id);
- m_create(p_scheduler, IMSG_DELIVERY_LOOP, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_DELIVERY_LOOP, 0, 0, -1);
m_add_evpid(p_scheduler, evp.id);
m_close(p_scheduler);
return;
- case IMSG_DELIVERY_HOLD:
+ case IMSG_MTA_DELIVERY_HOLD:
+ case IMSG_MDA_DELIVERY_HOLD:
+ imsg->hdr.type = IMSG_QUEUE_HOLDQ_RELEASE;
+ m_forward(p_scheduler, imsg);
+ return;
+
case IMSG_MTA_SCHEDULE:
+ imsg->hdr.type = IMSG_QUEUE_ENVELOPE_SCHEDULE;
m_forward(p_scheduler, imsg);
return;
- case IMSG_DELIVERY_RELEASE:
+
+ case IMSG_MTA_HOLDQ_RELEASE:
+ case IMSG_MDA_HOLDQ_RELEASE:
m_msg(&m, imsg);
m_get_id(&m, &holdq);
m_get_int(&m, &v);
m_end(&m);
-
- m_create(p_scheduler, IMSG_DELIVERY_RELEASE, 0, 0, -1);
- if (p->proc == PROC_MTA)
+ m_create(p_scheduler, IMSG_QUEUE_HOLDQ_RELEASE, 0, 0, -1);
+ if (imsg->hdr.type == IMSG_MTA_HOLDQ_RELEASE)
m_add_int(p_scheduler, D_MTA);
else
m_add_int(p_scheduler, D_MDA);
@@ -462,7 +474,6 @@ queue_imsg(struct mproc *p, struct imsg *imsg)
case IMSG_CTL_PAUSE_MTA:
case IMSG_CTL_RESUME_MDA:
case IMSG_CTL_RESUME_MTA:
- case IMSG_QUEUE_REMOVE:
m_forward(p_scheduler, imsg);
return;
}
@@ -521,11 +532,11 @@ queue_bounce(struct envelope *e, struct delivery_bounce *d)
log_debug("debug: queue: bouncing evp:%016" PRIx64
" as evp:%016" PRIx64, e->id, b.id);
- m_create(p_scheduler, IMSG_QUEUE_SUBMIT_ENVELOPE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_SUBMIT, 0, 0, -1);
m_add_envelope(p_scheduler, &b);
m_close(p_scheduler);
- m_create(p_scheduler, IMSG_QUEUE_COMMIT_MESSAGE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_MESSAGE_COMMIT, 0, 0, -1);
m_add_msgid(p_scheduler, evpid_to_msgid(b.id));
m_close(p_scheduler);
@@ -615,11 +626,9 @@ queue(void)
config_peer(PROC_PARENT);
config_peer(PROC_CONTROL);
- config_peer(PROC_SMTP);
- config_peer(PROC_MDA);
- config_peer(PROC_MTA);
config_peer(PROC_LKA);
config_peer(PROC_SCHEDULER);
+ config_peer(PROC_PONY);
config_done();
/* setup queue loading task */
@@ -647,7 +656,7 @@ queue_timeout(int fd, short event, void *p)
r = queue_envelope_walk(&evp);
if (r == -1) {
if (msgid) {
- m_create(p_scheduler, IMSG_QUEUE_COMMIT_MESSAGE,
+ m_create(p_scheduler, IMSG_QUEUE_MESSAGE_COMMIT,
0, 0, -1);
m_add_msgid(p_scheduler, msgid);
m_close(p_scheduler);
@@ -658,13 +667,13 @@ queue_timeout(int fd, short event, void *p)
if (r) {
if (msgid && evpid_to_msgid(evp.id) != msgid) {
- m_create(p_scheduler, IMSG_QUEUE_COMMIT_MESSAGE,
+ m_create(p_scheduler, IMSG_QUEUE_MESSAGE_COMMIT,
0, 0, -1);
m_add_msgid(p_scheduler, msgid);
m_close(p_scheduler);
}
msgid = evpid_to_msgid(evp.id);
- m_create(p_scheduler, IMSG_QUEUE_SUBMIT_ENVELOPE, 0, 0, -1);
+ m_create(p_scheduler, IMSG_QUEUE_ENVELOPE_SUBMIT, 0, 0, -1);
m_add_envelope(p_scheduler, &evp);
m_close(p_scheduler);
}
@@ -674,42 +683,6 @@ queue_timeout(int fd, short event, void *p)
evtimer_add(ev, &tv);
}
-void
-queue_ok(uint64_t evpid)
-{
- m_create(p_queue, IMSG_DELIVERY_OK, 0, 0, -1);
- m_add_evpid(p_queue, evpid);
- m_close(p_queue);
-}
-
-void
-queue_tempfail(uint64_t evpid, const char *reason, enum enhanced_status_code code)
-{
- m_create(p_queue, IMSG_DELIVERY_TEMPFAIL, 0, 0, -1);
- m_add_evpid(p_queue, evpid);
- m_add_string(p_queue, reason);
- m_add_int(p_queue, (int)code);
- m_close(p_queue);
-}
-
-void
-queue_permfail(uint64_t evpid, const char *reason, enum enhanced_status_code code)
-{
- m_create(p_queue, IMSG_DELIVERY_PERMFAIL, 0, 0, -1);
- m_add_evpid(p_queue, evpid);
- m_add_string(p_queue, reason);
- m_add_int(p_queue, (int)code);
- m_close(p_queue);
-}
-
-void
-queue_loop(uint64_t evpid)
-{
- m_create(p_queue, IMSG_DELIVERY_LOOP, 0, 0, -1);
- m_add_evpid(p_queue, evpid);
- m_close(p_queue);
-}
-
static void
queue_log(const struct envelope *e, const char *prefix, const char *status)
{
@@ -739,7 +712,7 @@ queue_flow_control(void)
int oldlimit = limit;
int set, unset;
- bufsz = p_mda->bytes_queued + p_mta->bytes_queued;
+ bufsz = p_pony->bytes_queued;
if (bufsz <= flow_agent_lowat)
limit &= ~LIMIT_AGENT;
else if (bufsz > flow_agent_hiwat)
@@ -756,15 +729,13 @@ queue_flow_control(void)
if (set & LIMIT_SCHEDULER) {
log_warnx("warn: queue: Hiwat reached on scheduler buffer: "
"suspending transfer, delivery and lookup input");
- mproc_disable(p_mta);
- mproc_disable(p_mda);
+ mproc_disable(p_pony);
mproc_disable(p_lka);
}
else if (unset & LIMIT_SCHEDULER) {
log_warnx("warn: queue: Down to lowat on scheduler buffer: "
"resuming transfer, delivery and lookup input");
- mproc_enable(p_mta);
- mproc_enable(p_mda);
+ mproc_enable(p_pony);
mproc_enable(p_lka);
}
diff --git a/usr.sbin/smtpd/scheduler.c b/usr.sbin/smtpd/scheduler.c
index be240ca5b43..7fbc27f6292 100644
--- a/usr.sbin/smtpd/scheduler.c
+++ b/usr.sbin/smtpd/scheduler.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scheduler.c,v 1.42 2014/02/04 14:56:03 eric Exp $ */
+/* $OpenBSD: scheduler.c,v 1.43 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -81,7 +81,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
switch (imsg->hdr.type) {
- case IMSG_QUEUE_SUBMIT_ENVELOPE:
+ case IMSG_QUEUE_ENVELOPE_SUBMIT:
m_msg(&m, imsg);
m_get_envelope(&m, &evp);
m_end(&m);
@@ -92,7 +92,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
backend->insert(&si);
return;
- case IMSG_QUEUE_COMMIT_MESSAGE:
+ case IMSG_QUEUE_MESSAGE_COMMIT:
m_msg(&m, imsg);
m_get_msgid(&m, &msgid);
m_end(&m);
@@ -104,7 +104,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_QUEUE_REMOVE_MESSAGE:
+ case IMSG_QUEUE_MESSAGE_ROLLBACK:
m_msg(&m, imsg);
m_get_msgid(&m, &msgid);
m_end(&m);
@@ -115,7 +115,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_QUEUE_REMOVE:
+ case IMSG_QUEUE_ENVELOPE_REMOVE:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_get_u32(&m, &inflight);
@@ -135,7 +135,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_DELIVERY_OK:
+ case IMSG_QUEUE_DELIVERY_OK:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
@@ -149,7 +149,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_DELIVERY_TEMPFAIL:
+ case IMSG_QUEUE_DELIVERY_TEMPFAIL:
m_msg(&m, imsg);
m_get_envelope(&m, &evp);
m_end(&m);
@@ -172,7 +172,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
req.bounce.type = B_WARNING;
req.bounce.delay = env->sc_bounce_warn[i];
req.bounce.expire = si.expire;
- m_compose(p, IMSG_QUEUE_BOUNCE, 0, 0, -1,
+ m_compose(p, IMSG_SCHED_ENVELOPE_BOUNCE, 0, 0, -1,
&req, sizeof req);
break;
}
@@ -180,7 +180,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_DELIVERY_PERMFAIL:
+ case IMSG_QUEUE_DELIVERY_PERMFAIL:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
@@ -194,7 +194,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_DELIVERY_LOOP:
+ case IMSG_QUEUE_DELIVERY_LOOP:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_end(&m);
@@ -208,7 +208,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_DELIVERY_HOLD:
+ case IMSG_QUEUE_HOLDQ_HOLD:
m_msg(&m, imsg);
m_get_evpid(&m, &evpid);
m_get_id(&m, &holdq);
@@ -222,7 +222,7 @@ scheduler_imsg(struct mproc *p, struct imsg *imsg)
scheduler_reset_events();
return;
- case IMSG_DELIVERY_RELEASE:
+ case IMSG_QUEUE_HOLDQ_RELEASE:
m_msg(&m, imsg);
m_get_int(&m, &type);
m_get_id(&m, &holdq);
@@ -563,7 +563,7 @@ scheduler_process_remove(struct scheduler_batch *batch)
for (i = 0; i < batch->evpcount; i++) {
log_debug("debug: scheduler: evp:%016" PRIx64 " removed",
batch->evpids[i]);
- m_create(p_queue, IMSG_QUEUE_REMOVE, 0, 0, -1);
+ m_create(p_queue, IMSG_SCHED_ENVELOPE_REMOVE, 0, 0, -1);
m_add_evpid(p_queue, batch->evpids[i]);
m_close(p_queue);
}
@@ -580,7 +580,7 @@ scheduler_process_expire(struct scheduler_batch *batch)
for (i = 0; i < batch->evpcount; i++) {
log_debug("debug: scheduler: evp:%016" PRIx64 " expired",
batch->evpids[i]);
- m_create(p_queue, IMSG_QUEUE_EXPIRE, 0, 0, -1);
+ m_create(p_queue, IMSG_SCHED_ENVELOPE_EXPIRE, 0, 0, -1);
m_add_evpid(p_queue, batch->evpids[i]);
m_close(p_queue);
}
@@ -610,7 +610,7 @@ scheduler_process_bounce(struct scheduler_batch *batch)
for (i = 0; i < batch->evpcount; i++) {
log_debug("debug: scheduler: evp:%016" PRIx64
" scheduled (bounce)", batch->evpids[i]);
- m_create(p_queue, IMSG_BOUNCE_INJECT, 0, 0, -1);
+ m_create(p_queue, IMSG_SCHED_ENVELOPE_INJECT, 0, 0, -1);
m_add_evpid(p_queue, batch->evpids[i]);
m_close(p_queue);
}
@@ -627,7 +627,7 @@ scheduler_process_mda(struct scheduler_batch *batch)
for (i = 0; i < batch->evpcount; i++) {
log_debug("debug: scheduler: evp:%016" PRIx64
" scheduled (mda)", batch->evpids[i]);
- m_create(p_queue, IMSG_MDA_DELIVER, 0, 0, -1);
+ m_create(p_queue, IMSG_SCHED_ENVELOPE_DELIVER, 0, 0, -1);
m_add_evpid(p_queue, batch->evpids[i]);
m_close(p_queue);
}
@@ -644,7 +644,7 @@ scheduler_process_mta(struct scheduler_batch *batch)
for (i = 0; i < batch->evpcount; i++) {
log_debug("debug: scheduler: evp:%016" PRIx64
" scheduled (mta)", batch->evpids[i]);
- m_create(p_queue, IMSG_MTA_TRANSFER, 0, 0, -1);
+ m_create(p_queue, IMSG_SCHED_ENVELOPE_TRANSFER, 0, 0, -1);
m_add_evpid(p_queue, batch->evpids[i]);
m_close(p_queue);
}
diff --git a/usr.sbin/smtpd/smtp.c b/usr.sbin/smtpd/smtp.c
index 91b079d9a8f..8f9bed59441 100644
--- a/usr.sbin/smtpd/smtp.c
+++ b/usr.sbin/smtpd/smtp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtp.c,v 1.133 2014/02/04 13:44:41 eric Exp $ */
+/* $OpenBSD: smtp.c,v 1.134 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -41,9 +41,6 @@
#include "log.h"
#include "ssl.h"
-static void smtp_imsg(struct mproc *, struct imsg *);
-static void smtp_shutdown(void);
-static void smtp_sig_handler(int, short, void *);
static void smtp_setup_events(void);
static void smtp_pause(void);
static void smtp_resume(void);
@@ -55,7 +52,7 @@ static void smtp_setup_listeners(void);
#define SMTP_FD_RESERVE 5
static size_t sessions;
-static void
+void
smtp_imsg(struct mproc *p, struct imsg *imsg)
{
struct msg m;
@@ -63,12 +60,12 @@ smtp_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_LKA) {
switch (imsg->hdr.type) {
- case IMSG_DNS_PTR:
- case IMSG_LKA_EXPAND_RCPT:
- case IMSG_LKA_HELO:
- case IMSG_LKA_AUTHENTICATE:
- case IMSG_LKA_SSL_INIT:
- case IMSG_LKA_SSL_VERIFY:
+ case IMSG_SMTP_DNS_PTR:
+ case IMSG_SMTP_EXPAND_RCPT:
+ case IMSG_SMTP_LOOKUP_HELO:
+ case IMSG_SMTP_AUTHENTICATE:
+ case IMSG_SMTP_SSL_INIT:
+ case IMSG_SMTP_SSL_VERIFY:
smtp_session_imsg(p, imsg);
return;
}
@@ -84,16 +81,16 @@ smtp_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_QUEUE) {
switch (imsg->hdr.type) {
- case IMSG_QUEUE_CREATE_MESSAGE:
- case IMSG_QUEUE_MESSAGE_FILE:
- case IMSG_QUEUE_SUBMIT_ENVELOPE:
- case IMSG_QUEUE_COMMIT_ENVELOPES:
- case IMSG_QUEUE_COMMIT_MESSAGE:
+ case IMSG_SMTP_MESSAGE_COMMIT:
+ case IMSG_SMTP_MESSAGE_CREATE:
+ case IMSG_SMTP_MESSAGE_OPEN:
+ case IMSG_QUEUE_ENVELOPE_SUBMIT:
+ case IMSG_QUEUE_ENVELOPE_COMMIT:
smtp_session_imsg(p, imsg);
return;
- case IMSG_SMTP_ENQUEUE_FD:
- m_compose(p, IMSG_SMTP_ENQUEUE_FD, 0, 0,
+ case IMSG_QUEUE_SMTP_SESSION:
+ m_compose(p, IMSG_QUEUE_SMTP_SESSION, 0, 0,
smtp_enqueue(NULL), imsg->data,
imsg->hdr.len - sizeof imsg->hdr);
return;
@@ -128,8 +125,8 @@ smtp_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_CONTROL) {
switch (imsg->hdr.type) {
- case IMSG_SMTP_ENQUEUE_FD:
- m_compose(p, IMSG_SMTP_ENQUEUE_FD, imsg->hdr.peerid, 0,
+ case IMSG_CTL_SMTP_SESSION:
+ m_compose(p, IMSG_CTL_SMTP_SESSION, imsg->hdr.peerid, 0,
smtp_enqueue(imsg->data), NULL, 0);
return;
@@ -150,86 +147,21 @@ smtp_imsg(struct mproc *p, struct imsg *imsg)
errx(1, "smtp_imsg: unexpected %s imsg", imsg_to_str(imsg->hdr.type));
}
-static void
-smtp_sig_handler(int sig, short event, void *p)
+void
+smtp_postfork(void)
{
- switch (sig) {
- case SIGINT:
- case SIGTERM:
- smtp_shutdown();
- break;
- default:
- fatalx("smtp_sig_handler: unexpected signal");
- }
+ smtp_setup_listeners();
}
-static void
-smtp_shutdown(void)
+void
+smtp_postprivdrop(void)
{
- log_info("info: smtp server exiting");
- _exit(0);
}
-pid_t
-smtp(void)
+void
+smtp_configure(void)
{
- pid_t pid;
- struct passwd *pw;
- struct event ev_sigint;
- struct event ev_sigterm;
-
- switch (pid = fork()) {
- case -1:
- fatal("smtp: cannot fork");
- case 0:
- post_fork(PROC_SMTP);
- break;
- default:
- return (pid);
- }
-
- smtp_setup_listeners();
-
- /* SSL will be purged later */
- purge_config(PURGE_TABLES|PURGE_RULES);
-
- if ((pw = getpwnam(SMTPD_USER)) == NULL)
- fatalx("unknown user " SMTPD_USER);
-
- if (chroot(PATH_CHROOT) == -1)
- fatal("smtp: chroot");
- if (chdir("/") == -1)
- fatal("smtp: chdir(\"/\")");
-
- config_process(PROC_SMTP);
-
- if (setgroups(1, &pw->pw_gid) ||
- setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
- setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
- fatal("smtp: cannot drop privileges");
-
- imsg_callback = smtp_imsg;
- event_init();
-
- signal_set(&ev_sigint, SIGINT, smtp_sig_handler, NULL);
- signal_set(&ev_sigterm, SIGTERM, smtp_sig_handler, NULL);
- signal_add(&ev_sigint, NULL);
- signal_add(&ev_sigterm, NULL);
- signal(SIGPIPE, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
-
- config_peer(PROC_CONTROL);
- config_peer(PROC_PARENT);
- config_peer(PROC_LKA);
- config_peer(PROC_MFA);
- config_peer(PROC_QUEUE);
- config_done();
-
- if (event_dispatch() < 0)
- fatal("event_dispatch");
- smtp_shutdown();
-
- return (0);
+ smtp_setup_events();
}
static void
diff --git a/usr.sbin/smtpd/smtp_session.c b/usr.sbin/smtpd/smtp_session.c
index 39a7b501f46..a0c85cce723 100644
--- a/usr.sbin/smtpd/smtp_session.c
+++ b/usr.sbin/smtpd/smtp_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtp_session.c,v 1.197 2014/03/14 11:14:11 eric Exp $ */
+/* $OpenBSD: smtp_session.c,v 1.198 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -271,7 +271,10 @@ smtp_session(struct listener *listener, int sock,
if (smtp_lookup_servername(s))
smtp_connected(s);
} else {
- dns_query_ptr(s->id, (struct sockaddr *)&s->ss);
+ m_create(p_lka, IMSG_SMTP_DNS_PTR, 0, 0, -1);
+ m_add_id(p_lka, s->id);
+ m_add_sockaddr(p_lka, (struct sockaddr *)&s->ss);
+ m_close(p_lka);
tree_xset(&wait_lka_ptr, s->id, s);
}
@@ -296,7 +299,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
void *ssl_ctx;
switch (imsg->hdr.type) {
- case IMSG_DNS_PTR:
+ case IMSG_SMTP_DNS_PTR:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &dnserror);
@@ -311,7 +314,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
smtp_connected(s);
return;
- case IMSG_LKA_EXPAND_RCPT:
+ case IMSG_SMTP_EXPAND_RCPT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &status);
@@ -336,7 +339,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_LKA_HELO:
+ case IMSG_SMTP_LOOKUP_HELO:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
s = tree_xpop(&wait_lka_helo, reqid);
@@ -363,7 +366,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
smtp_mfa_response(s, status, code, line);
return;
- case IMSG_QUEUE_CREATE_MESSAGE:
+ case IMSG_SMTP_MESSAGE_CREATE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &success);
@@ -384,7 +387,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_QUEUE_MESSAGE_FILE:
+ case IMSG_SMTP_MESSAGE_OPEN:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &success);
@@ -445,7 +448,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_QUEUE_SUBMIT_ENVELOPE:
+ case IMSG_QUEUE_ENVELOPE_SUBMIT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &success);
@@ -459,7 +462,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
m_end(&m);
return;
- case IMSG_QUEUE_COMMIT_ENVELOPES:
+ case IMSG_QUEUE_ENVELOPE_COMMIT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &success);
@@ -493,14 +496,14 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_QUEUE_COMMIT_MESSAGE:
+ case IMSG_SMTP_MESSAGE_COMMIT:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &success);
m_end(&m);
s = tree_xpop(&wait_queue_commit, reqid);
if (!success) {
- m_create(p_mfa, IMSG_MFA_EVENT_ROLLBACK, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_EVENT_ROLLBACK, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_close(p_mfa);
smtp_reply(s, "421 %s: Temporary failure",
@@ -510,7 +513,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
return;
}
- m_create(p_mfa, IMSG_MFA_EVENT_COMMIT, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_EVENT_COMMIT, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_close(p_mfa);
@@ -543,7 +546,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_LKA_AUTHENTICATE:
+ case IMSG_SMTP_AUTHENTICATE:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_int(&m, &success);
@@ -578,7 +581,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
io_reload(&s->io);
return;
- case IMSG_LKA_SSL_INIT:
+ case IMSG_SMTP_SSL_INIT:
resp_ca_cert = imsg->data;
s = tree_xpop(&wait_ssl_init, resp_ca_cert->reqid);
@@ -618,7 +621,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg)
free(resp_ca_cert);
return;
- case IMSG_LKA_SSL_VERIFY:
+ case IMSG_SMTP_SSL_VERIFY:
resp_ca_vrfy = imsg->data;
s = tree_xpop(&wait_ssl_verify, resp_ca_vrfy->reqid);
@@ -657,7 +660,7 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code,
switch (s->mfa_imsg) {
- case IMSG_MFA_REQ_CONNECT:
+ case IMSG_SMTP_REQ_CONNECT:
if (status != MFA_OK) {
log_info("smtp-in: Disconnecting session %016" PRIx64
": rejected by filter", s->id);
@@ -673,7 +676,7 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code,
else
strlcpy(req_ca_cert.name, s->smtpname,
sizeof req_ca_cert.name);
- m_compose(p_lka, IMSG_LKA_SSL_INIT, 0, 0, -1,
+ m_compose(p_lka, IMSG_SMTP_SSL_INIT, 0, 0, -1,
&req_ca_cert, sizeof(req_ca_cert));
tree_xset(&wait_ssl_init, s->id, s);
return;
@@ -681,7 +684,7 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code,
smtp_send_banner(s);
return;
- case IMSG_MFA_REQ_HELO:
+ case IMSG_SMTP_REQ_HELO:
if (status != MFA_OK) {
code = code ? code : 530;
line = line ? line : "Hello rejected";
@@ -713,7 +716,7 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code,
io_reload(&s->io);
return;
- case IMSG_MFA_REQ_MAIL:
+ case IMSG_SMTP_REQ_MAIL:
if (status != MFA_OK) {
code = code ? code : 530;
line = line ? line : "Sender rejected";
@@ -722,13 +725,13 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code,
return;
}
- m_create(p_queue, IMSG_QUEUE_CREATE_MESSAGE, 0, 0, -1);
+ m_create(p_queue, IMSG_SMTP_MESSAGE_CREATE, 0, 0, -1);
m_add_id(p_queue, s->id);
m_close(p_queue);
tree_xset(&wait_queue_msg, s->id, s);
return;
- case IMSG_MFA_REQ_RCPT:
+ case IMSG_SMTP_REQ_RCPT:
if (status != MFA_OK) {
code = code ? code : 530;
line = line ? line : "Recipient rejected";
@@ -744,14 +747,14 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code,
return;
}
- m_create(p_lka, IMSG_LKA_EXPAND_RCPT, 0, 0, -1);
+ m_create(p_lka, IMSG_SMTP_EXPAND_RCPT, 0, 0, -1);
m_add_id(p_lka, s->id);
m_add_envelope(p_lka, &s->evp);
m_close(p_lka);
tree_xset(&wait_lka_rcpt, s->id, s);
return;
- case IMSG_MFA_REQ_DATA:
+ case IMSG_SMTP_REQ_DATA:
if (status != MFA_OK) {
code = code ? code : 530;
line = line ? line : "Message rejected";
@@ -759,14 +762,14 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code,
io_reload(&s->io);
return;
}
- m_create(p_queue, IMSG_QUEUE_MESSAGE_FILE, 0, 0, -1);
+ m_create(p_queue, IMSG_SMTP_MESSAGE_OPEN, 0, 0, -1);
m_add_id(p_queue, s->id);
m_add_msgid(p_queue, evpid_to_msgid(s->evp.id));
m_close(p_queue);
tree_xset(&wait_queue_fd, s->id, s);
return;
- case IMSG_MFA_REQ_EOM:
+ case IMSG_SMTP_REQ_EOM:
if (status != MFA_OK) {
code = code ? code : 530;
line = line ? line : "Message rejected";
@@ -891,11 +894,11 @@ smtp_io(struct io *io, int evt)
iobuf_normalize(&s->iobuf);
io_set_write(io);
- m_create(p_mfa, IMSG_MFA_REQ_EOM, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_REQ_EOM, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_add_u32(p_mfa, s->datalen);
m_close(p_mfa);
- smtp_wait_mfa(s, IMSG_MFA_REQ_EOM);
+ smtp_wait_mfa(s, IMSG_SMTP_REQ_EOM);
return;
}
@@ -924,7 +927,7 @@ smtp_io(struct io *io, int evt)
else
strlcpy(req_ca_cert.name, s->smtpname,
sizeof req_ca_cert.name);
- m_compose(p_lka, IMSG_LKA_SSL_INIT, 0, 0, -1,
+ m_compose(p_lka, IMSG_SMTP_SSL_INIT, 0, 0, -1,
&req_ca_cert, sizeof(req_ca_cert));
tree_xset(&wait_ssl_init, s->id, s);
break;
@@ -1044,11 +1047,11 @@ smtp_command(struct smtp_session *s, char *line)
smtp_message_reset(s, 1);
- m_create(p_mfa, IMSG_MFA_REQ_HELO, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_REQ_HELO, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_add_string(p_mfa, s->helo);
m_close(p_mfa);
- smtp_wait_mfa(s, IMSG_MFA_REQ_HELO);
+ smtp_wait_mfa(s, IMSG_SMTP_REQ_HELO);
break;
/*
@@ -1178,11 +1181,11 @@ smtp_command(struct smtp_session *s, char *line)
if (args && smtp_parse_mail_args(s, args) == -1)
break;
- m_create(p_mfa, IMSG_MFA_REQ_MAIL, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_REQ_MAIL, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_add_mailaddr(p_mfa, &s->evp.sender);
m_close(p_mfa);
- smtp_wait_mfa(s, IMSG_MFA_REQ_MAIL);
+ smtp_wait_mfa(s, IMSG_SMTP_REQ_MAIL);
break;
/*
* TRANSACTION
@@ -1212,11 +1215,11 @@ smtp_command(struct smtp_session *s, char *line)
if (args && smtp_parse_rcpt_args(s, args) == -1)
break;
- m_create(p_mfa, IMSG_MFA_REQ_RCPT, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_REQ_RCPT, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_add_mailaddr(p_mfa, &s->evp.rcpt);
m_close(p_mfa);
- smtp_wait_mfa(s, IMSG_MFA_REQ_RCPT);
+ smtp_wait_mfa(s, IMSG_SMTP_REQ_RCPT);
break;
case CMD_RSET:
@@ -1227,12 +1230,12 @@ smtp_command(struct smtp_session *s, char *line)
break;
}
- m_create(p_mfa, IMSG_MFA_EVENT_RSET, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_EVENT_RSET, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_close(p_mfa);
if (s->evp.id) {
- m_create(p_queue, IMSG_QUEUE_REMOVE_MESSAGE, 0, 0, -1);
+ m_create(p_queue, IMSG_SMTP_MESSAGE_ROLLBACK, 0, 0, -1);
m_add_msgid(p_queue, evpid_to_msgid(s->evp.id));
m_close(p_queue);
}
@@ -1257,10 +1260,10 @@ smtp_command(struct smtp_session *s, char *line)
break;
}
- m_create(p_mfa, IMSG_MFA_REQ_DATA, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_REQ_DATA, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_close(p_mfa);
- smtp_wait_mfa(s, IMSG_MFA_REQ_DATA);
+ smtp_wait_mfa(s, IMSG_SMTP_REQ_DATA);
break;
/*
* ANY
@@ -1339,7 +1342,7 @@ smtp_rfc4954_auth_plain(struct smtp_session *s, char *arg)
goto abort;
pass++; /* skip NUL */
- m_create(p_lka, IMSG_LKA_AUTHENTICATE, 0, 0, -1);
+ m_create(p_lka, IMSG_SMTP_AUTHENTICATE, 0, 0, -1);
m_add_id(p_lka, s->id);
m_add_string(p_lka, s->listener->authtable);
m_add_string(p_lka, user);
@@ -1386,7 +1389,7 @@ smtp_rfc4954_auth_login(struct smtp_session *s, char *arg)
sizeof(buf)-1) == -1)
goto abort;
- m_create(p_lka, IMSG_LKA_AUTHENTICATE, 0, 0, -1);
+ m_create(p_lka, IMSG_SMTP_AUTHENTICATE, 0, 0, -1);
m_add_id(p_lka, s->id);
m_add_string(p_lka, s->listener->authtable);
m_add_string(p_lka, s->username);
@@ -1517,7 +1520,7 @@ smtp_lookup_servername(struct smtp_session *s)
log_warn("warn: getsockname()");
}
else {
- m_create(p_lka, IMSG_LKA_HELO, 0, 0, -1);
+ m_create(p_lka, IMSG_SMTP_LOOKUP_HELO, 0, 0, -1);
m_add_id(p_lka, s->id);
m_add_string(p_lka, s->listener->hostnametable);
m_add_sockaddr(p_lka, sa);
@@ -1546,14 +1549,14 @@ smtp_connected(struct smtp_session *s)
return;
}
- m_create(p_mfa, IMSG_MFA_REQ_CONNECT, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_REQ_CONNECT, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_add_sockaddr(p_mfa, (struct sockaddr *)&ss);
m_add_sockaddr(p_mfa, (struct sockaddr *)&s->ss);
m_add_string(p_mfa, s->hostname);
m_close(p_mfa);
s->flags |= SF_MFACONNSENT;
- smtp_wait_mfa(s, IMSG_MFA_REQ_CONNECT);
+ smtp_wait_mfa(s, IMSG_SMTP_REQ_CONNECT);
}
static void
@@ -1612,7 +1615,7 @@ smtp_message_end(struct smtp_session *s)
s->ofile = NULL;
if (s->msgflags & (MF_ERROR_SIZE | MF_ERROR_MFA | MF_ERROR_IO)) {
- m_create(p_queue, IMSG_QUEUE_REMOVE_MESSAGE, 0, 0, -1);
+ m_create(p_queue, IMSG_SMTP_MESSAGE_ROLLBACK, 0, 0, -1);
m_add_msgid(p_queue, evpid_to_msgid(s->evp.id));
m_close(p_queue);
if (s->msgflags & MF_ERROR_SIZE)
@@ -1626,7 +1629,7 @@ smtp_message_end(struct smtp_session *s)
return;
}
- m_create(p_queue, IMSG_QUEUE_COMMIT_MESSAGE, 0, 0, -1);
+ m_create(p_queue, IMSG_SMTP_MESSAGE_COMMIT, 0, 0, -1);
m_add_id(p_queue, s->id);
m_add_msgid(p_queue, evpid_to_msgid(s->evp.id));
m_close(p_queue);
@@ -1723,13 +1726,13 @@ smtp_free(struct smtp_session *s, const char * reason)
fclose(s->ofile);
if (s->evp.id) {
- m_create(p_queue, IMSG_QUEUE_REMOVE_MESSAGE, 0, 0, -1);
+ m_create(p_queue, IMSG_SMTP_MESSAGE_ROLLBACK, 0, 0, -1);
m_add_msgid(p_queue, evpid_to_msgid(s->evp.id));
m_close(p_queue);
}
if (s->flags & SF_MFACONNSENT) {
- m_create(p_mfa, IMSG_MFA_EVENT_DISCONNECT, 0, 0, -1);
+ m_create(p_mfa, IMSG_SMTP_EVENT_DISCONNECT, 0, 0, -1);
m_add_id(p_mfa, s->id);
m_close(p_mfa);
}
@@ -1847,7 +1850,7 @@ smtp_verify_certificate(struct smtp_session *s)
iov[0].iov_len = sizeof(req_ca_vrfy);
iov[1].iov_base = req_ca_vrfy.cert;
iov[1].iov_len = req_ca_vrfy.cert_len;
- m_composev(p_lka, IMSG_LKA_SSL_VERIFY_CERT, 0, 0, -1,
+ m_composev(p_lka, IMSG_SMTP_SSL_VERIFY_CERT, 0, 0, -1,
iov, nitems(iov));
free(req_ca_vrfy.cert);
X509_free(x);
@@ -1863,7 +1866,7 @@ smtp_verify_certificate(struct smtp_session *s)
iov[0].iov_len = sizeof(req_ca_vrfy);
iov[1].iov_base = req_ca_vrfy.cert;
iov[1].iov_len = req_ca_vrfy.cert_len;
- m_composev(p_lka, IMSG_LKA_SSL_VERIFY_CHAIN, 0, 0, -1,
+ m_composev(p_lka, IMSG_SMTP_SSL_VERIFY_CHAIN, 0, 0, -1,
iov, nitems(iov));
free(req_ca_vrfy.cert);
}
@@ -1872,7 +1875,7 @@ smtp_verify_certificate(struct smtp_session *s)
/* Tell lookup process that it can start verifying, we're done */
memset(&req_ca_vrfy, 0, sizeof req_ca_vrfy);
req_ca_vrfy.reqid = s->id;
- m_compose(p_lka, IMSG_LKA_SSL_VERIFY, 0, 0, -1,
+ m_compose(p_lka, IMSG_SMTP_SSL_VERIFY, 0, 0, -1,
&req_ca_vrfy, sizeof req_ca_vrfy);
return 1;
diff --git a/usr.sbin/smtpd/smtpctl.c b/usr.sbin/smtpd/smtpctl.c
index 84bd628a46b..b523f8bb06b 100644
--- a/usr.sbin/smtpd/smtpctl.c
+++ b/usr.sbin/smtpd/smtpctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpctl.c,v 1.116 2014/02/17 13:33:56 eric Exp $ */
+/* $OpenBSD: smtpctl.c,v 1.117 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2013 Eric Faurot <eric@openbsd.org>
@@ -414,8 +414,8 @@ do_monitor(int argc, struct parameter *argv)
count = 0;
while (1) {
- srv_send(IMSG_DIGEST, NULL, 0);
- srv_recv(IMSG_DIGEST);
+ srv_send(IMSG_CTL_GET_DIGEST, NULL, 0);
+ srv_recv(IMSG_CTL_GET_DIGEST);
srv_read(&digest, sizeof(digest));
srv_end();
@@ -711,8 +711,8 @@ do_show_stats(int argc, struct parameter *argv)
memset(&kv, 0, sizeof kv);
while (1) {
- srv_send(IMSG_STATS_GET, &kv, sizeof kv);
- srv_recv(IMSG_STATS_GET);
+ srv_send(IMSG_CTL_GET_STATS, &kv, sizeof kv);
+ srv_recv(IMSG_CTL_GET_STATS);
srv_read(&kv, sizeof(kv));
srv_end();
@@ -786,7 +786,7 @@ do_trace(int argc, struct parameter *argv)
v = str_to_trace(argv[0].u.u_str);
- srv_send(IMSG_CTL_TRACE, &v, sizeof(v));
+ srv_send(IMSG_CTL_TRACE_ENABLE, &v, sizeof(v));
return srv_check_result(1);
}
@@ -797,7 +797,7 @@ do_unprofile(int argc, struct parameter *argv)
v = str_to_profile(argv[0].u.u_str);
- srv_send(IMSG_CTL_UNPROFILE, &v, sizeof(v));
+ srv_send(IMSG_CTL_PROFILE_DISABLE, &v, sizeof(v));
return srv_check_result(1);
}
@@ -808,7 +808,7 @@ do_untrace(int argc, struct parameter *argv)
v = str_to_trace(argv[0].u.u_str);
- srv_send(IMSG_CTL_UNTRACE, &v, sizeof(v));
+ srv_send(IMSG_CTL_TRACE_DISABLE, &v, sizeof(v));
return srv_check_result(1);
}
@@ -817,7 +817,7 @@ do_update_table(int argc, struct parameter *argv)
{
const char *name = argv[0].u.u_str;
- srv_send(IMSG_LKA_UPDATE_TABLE, name, strlen(name) + 1);
+ srv_send(IMSG_CTL_UPDATE_TABLE, name, strlen(name) + 1);
return srv_check_result(1);
}
diff --git a/usr.sbin/smtpd/smtpd.c b/usr.sbin/smtpd/smtpd.c
index 4399e308e91..1d977cd6f6e 100644
--- a/usr.sbin/smtpd/smtpd.c
+++ b/usr.sbin/smtpd/smtpd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd.c,v 1.217 2014/04/04 13:13:58 eric Exp $ */
+/* $OpenBSD: smtpd.c,v 1.218 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -58,7 +58,7 @@ static void parent_shutdown(int);
static void parent_send_config(int, short, void *);
static void parent_send_config_lka(void);
static void parent_send_config_mfa(void);
-static void parent_send_config_smtp(void);
+static void parent_send_config_pony(void);
static void parent_sig_handler(int, short, void *);
static void forkmda(struct mproc *, uint64_t, struct deliver *);
static int parent_forward_open(char *, char *, uid_t, gid_t);
@@ -118,13 +118,11 @@ struct smtpd *env = NULL;
struct mproc *p_control = NULL;
struct mproc *p_lka = NULL;
-struct mproc *p_mda = NULL;
struct mproc *p_mfa = NULL;
-struct mproc *p_mta = NULL;
struct mproc *p_parent = NULL;
struct mproc *p_queue = NULL;
struct mproc *p_scheduler = NULL;
-struct mproc *p_smtp = NULL;
+struct mproc *p_pony = NULL;
const char *backend_queue = "fs";
const char *backend_scheduler = "ramqueue";
@@ -154,7 +152,7 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
if (p->proc == PROC_LKA) {
switch (imsg->hdr.type) {
- case IMSG_PARENT_FORWARD_OPEN:
+ case IMSG_LKA_OPEN_FORWARD:
fwreq = imsg->data;
fd = parent_forward_open(fwreq->user, fwreq->directory,
fwreq->uid, fwreq->gid);
@@ -165,7 +163,7 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
}
else
fwreq->status = 1;
- m_compose(p, IMSG_PARENT_FORWARD_OPEN, 0, 0, fd,
+ m_compose(p, IMSG_LKA_OPEN_FORWARD, 0, 0, fd,
fwreq, sizeof *fwreq);
return;
@@ -190,9 +188,9 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
}
}
- if (p->proc == PROC_MDA) {
+ if (p->proc == PROC_PONY) {
switch (imsg->hdr.type) {
- case IMSG_PARENT_FORK_MDA:
+ case IMSG_MDA_FORK:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_data(&m, &data, &sz);
@@ -203,7 +201,7 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
forkmda(p, reqid, &deliver);
return;
- case IMSG_PARENT_KILL_MDA:
+ case IMSG_MDA_KILL:
m_msg(&m, imsg);
m_get_id(&m, &reqid);
m_get_string(&m, &cause);
@@ -237,14 +235,12 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
m_end(&m);
log_verbose(v);
m_forward(p_lka, imsg);
- m_forward(p_mda, imsg);
m_forward(p_mfa, imsg);
- m_forward(p_mta, imsg);
m_forward(p_queue, imsg);
- m_forward(p_smtp, imsg);
+ m_forward(p_pony, imsg);
return;
- case IMSG_CTL_TRACE:
+ case IMSG_CTL_TRACE_ENABLE:
m_msg(&m, imsg);
m_get_int(&m, &v);
m_end(&m);
@@ -253,7 +249,7 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
parent_broadcast_verbose(verbose);
return;
- case IMSG_CTL_UNTRACE:
+ case IMSG_CTL_TRACE_DISABLE:
m_msg(&m, imsg);
m_get_int(&m, &v);
m_end(&m);
@@ -262,7 +258,7 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
parent_broadcast_verbose(verbose);
return;
- case IMSG_CTL_PROFILE:
+ case IMSG_CTL_PROFILE_ENABLE:
m_msg(&m, imsg);
m_get_int(&m, &v);
m_end(&m);
@@ -270,7 +266,7 @@ parent_imsg(struct mproc *p, struct imsg *imsg)
parent_broadcast_profile(profiling);
return;
- case IMSG_CTL_UNPROFILE:
+ case IMSG_CTL_PROFILE_DISABLE:
m_msg(&m, imsg);
m_get_int(&m, &v);
m_end(&m);
@@ -324,30 +320,23 @@ parent_send_config(int fd, short event, void *p)
{
parent_send_config_lka();
parent_send_config_mfa();
- parent_send_config_smtp();
+ parent_send_config_pony();
purge_config(PURGE_PKI);
}
static void
-parent_send_config_smtp(void)
+parent_send_config_pony(void)
{
- log_debug("debug: parent_send_config: configuring smtp");
- m_compose(p_smtp, IMSG_CONF_START, 0, 0, -1, NULL, 0);
- m_compose(p_smtp, IMSG_CONF_END, 0, 0, -1, NULL, 0);
+ log_debug("debug: parent_send_config: configuring pony process");
+ m_compose(p_pony, IMSG_CONF_START, 0, 0, -1, NULL, 0);
+ m_compose(p_pony, IMSG_CONF_END, 0, 0, -1, NULL, 0);
}
void
parent_send_config_mfa()
{
- struct filter *f;
- void *iter_dict = NULL;
-
log_debug("debug: parent_send_config_mfa: reloading");
m_compose(p_mfa, IMSG_CONF_START, 0, 0, -1, NULL, 0);
-
- while (dict_iter(&env->sc_filters, &iter_dict, NULL, (void **)&f))
- m_compose(p_mfa, IMSG_CONF_FILTER, 0, 0, -1, f, sizeof(*f));
-
m_compose(p_mfa, IMSG_CONF_END, 0, 0, -1, NULL, 0);
}
@@ -425,11 +414,11 @@ parent_sig_handler(int sig, short event, void *p)
log_debug("debug: smtpd: mda process done "
"for session %016"PRIx64 ": %s",
child->mda_id, cause);
- m_create(p_mda, IMSG_MDA_DONE, 0, 0,
+ m_create(p_pony, IMSG_MDA_DONE, 0, 0,
child->mda_out);
- m_add_id(p_mda, child->mda_id);
- m_add_string(p_mda, cause);
- m_close(p_mda);
+ m_add_id(p_pony, child->mda_id);
+ m_add_string(p_pony, cause);
+ m_close(p_pony);
/* free(cause); */
break;
@@ -670,11 +659,9 @@ main(int argc, char *argv[])
config_peer(PROC_CONTROL);
config_peer(PROC_LKA);
- config_peer(PROC_MDA);
config_peer(PROC_MFA);
- config_peer(PROC_MTA);
- config_peer(PROC_SMTP);
config_peer(PROC_QUEUE);
+ config_peer(PROC_PONY);
config_done();
evtimer_set(&config_ev, parent_send_config, NULL);
@@ -738,12 +725,9 @@ fork_peers(void)
child_add(queue(), CHILD_DAEMON, proc_title(PROC_QUEUE));
child_add(control(), CHILD_DAEMON, proc_title(PROC_CONTROL));
child_add(lka(), CHILD_DAEMON, proc_title(PROC_LKA));
- child_add(mda(), CHILD_DAEMON, proc_title(PROC_MDA));
child_add(mfa(), CHILD_DAEMON, proc_title(PROC_MFA));
- child_add(mta(), CHILD_DAEMON, proc_title(PROC_MTA));
child_add(scheduler(), CHILD_DAEMON, proc_title(PROC_SCHEDULER));
- child_add(smtp(), CHILD_DAEMON, proc_title(PROC_SMTP));
-
+ child_add(pony(), CHILD_DAEMON, proc_title(PROC_PONY));
post_fork(PROC_PARENT);
}
@@ -836,29 +820,29 @@ forkmda(struct mproc *p, uint64_t id, struct deliver *deliver)
db = delivery_backend_lookup(deliver->mode);
if (db == NULL) {
snprintf(ebuf, sizeof ebuf, "could not find delivery backend");
- m_create(p_mda, IMSG_MDA_DONE, 0, 0, -1);
- m_add_id(p_mda, id);
- m_add_string(p_mda, ebuf);
- m_close(p_mda);
+ m_create(p_pony, IMSG_MDA_DONE, 0, 0, -1);
+ m_add_id(p_pony, id);
+ m_add_string(p_pony, ebuf);
+ m_close(p_pony);
return;
}
if (deliver->userinfo.uid == 0 && ! db->allow_root) {
snprintf(ebuf, sizeof ebuf, "not allowed to deliver to: %s",
deliver->user);
- m_create(p_mda, IMSG_MDA_DONE, 0, 0, -1);
- m_add_id(p_mda, id);
- m_add_string(p_mda, ebuf);
- m_close(p_mda);
+ m_create(p_pony, IMSG_MDA_DONE, 0, 0, -1);
+ m_add_id(p_pony, id);
+ m_add_string(p_pony, ebuf);
+ m_close(p_pony);
return;
}
if (pipe(pipefd) < 0) {
snprintf(ebuf, sizeof ebuf, "pipe: %s", strerror(errno));
- m_create(p_mda, IMSG_MDA_DONE, 0, 0, -1);
- m_add_id(p_mda, id);
- m_add_string(p_mda, ebuf);
- m_close(p_mda);
+ m_create(p_pony, IMSG_MDA_DONE, 0, 0, -1);
+ m_add_id(p_pony, id);
+ m_add_string(p_pony, ebuf);
+ m_close(p_pony);
return;
}
@@ -869,10 +853,10 @@ forkmda(struct mproc *p, uint64_t id, struct deliver *deliver)
umask(omode);
if (allout < 0) {
snprintf(ebuf, sizeof ebuf, "mkstemp: %s", strerror(errno));
- m_create(p_mda, IMSG_MDA_DONE, 0, 0, -1);
- m_add_id(p_mda, id);
- m_add_string(p_mda, ebuf);
- m_close(p_mda);
+ m_create(p_pony, IMSG_MDA_DONE, 0, 0, -1);
+ m_add_id(p_pony, id);
+ m_add_string(p_pony, ebuf);
+ m_close(p_pony);
close(pipefd[0]);
close(pipefd[1]);
return;
@@ -882,10 +866,10 @@ forkmda(struct mproc *p, uint64_t id, struct deliver *deliver)
pid = fork();
if (pid < 0) {
snprintf(ebuf, sizeof ebuf, "fork: %s", strerror(errno));
- m_create(p_mda, IMSG_MDA_DONE, 0, 0, -1);
- m_add_id(p_mda, id);
- m_add_string(p_mda, ebuf);
- m_close(p_mda);
+ m_create(p_pony, IMSG_MDA_DONE, 0, 0, -1);
+ m_add_id(p_pony, id);
+ m_add_string(p_pony, ebuf);
+ m_close(p_pony);
close(pipefd[0]);
close(pipefd[1]);
close(allout);
@@ -898,7 +882,7 @@ forkmda(struct mproc *p, uint64_t id, struct deliver *deliver)
child->mda_out = allout;
child->mda_id = id;
close(pipefd[0]);
- m_create(p, IMSG_PARENT_FORK_MDA, 0, 0, pipefd[1]);
+ m_create(p, IMSG_MDA_FORK, 0, 0, pipefd[1]);
m_add_id(p, id);
m_close(p);
return;
@@ -1226,22 +1210,18 @@ proc_title(enum smtp_proc_type proc)
switch (proc) {
case PROC_PARENT:
return "[priv]";
- case PROC_SMTP:
- return "smtp";
case PROC_MFA:
return "filter";
case PROC_LKA:
return "lookup";
case PROC_QUEUE:
return "queue";
- case PROC_MDA:
- return "delivery";
- case PROC_MTA:
- return "transfer";
case PROC_CONTROL:
return "control";
case PROC_SCHEDULER:
return "scheduler";
+ case PROC_PONY:
+ return "pony express";
default:
return "unknown";
}
@@ -1253,23 +1233,18 @@ proc_name(enum smtp_proc_type proc)
switch (proc) {
case PROC_PARENT:
return "parent";
- case PROC_SMTP:
- return "smtp";
case PROC_MFA:
return "mfa";
case PROC_LKA:
return "lka";
case PROC_QUEUE:
return "queue";
- case PROC_MDA:
- return "mda";
- case PROC_MTA:
- return "mta";
case PROC_CONTROL:
return "control";
case PROC_SCHEDULER:
return "scheduler";
-
+ case PROC_PONY:
+ return "pony";
case PROC_FILTER:
return "filter-proc";
case PROC_CLIENT:
@@ -1288,123 +1263,137 @@ imsg_to_str(int type)
switch (type) {
CASE(IMSG_NONE);
+
CASE(IMSG_CTL_OK);
CASE(IMSG_CTL_FAIL);
- CASE(IMSG_CTL_SHUTDOWN);
- CASE(IMSG_CTL_VERBOSE);
+
+ CASE(IMSG_CTL_GET_DIGEST);
+ CASE(IMSG_CTL_GET_STATS);
+ CASE(IMSG_CTL_LIST_MESSAGES);
+ CASE(IMSG_CTL_LIST_ENVELOPES);
+ CASE(IMSG_CTL_MTA_SHOW_HOSTS);
+ CASE(IMSG_CTL_MTA_SHOW_RELAYS);
+ CASE(IMSG_CTL_MTA_SHOW_ROUTES);
+ CASE(IMSG_CTL_MTA_SHOW_HOSTSTATS);
+ CASE(IMSG_CTL_MTA_BLOCK);
+ CASE(IMSG_CTL_MTA_UNBLOCK);
+ CASE(IMSG_CTL_MTA_SHOW_BLOCK);
CASE(IMSG_CTL_PAUSE_EVP);
CASE(IMSG_CTL_PAUSE_MDA);
CASE(IMSG_CTL_PAUSE_MTA);
CASE(IMSG_CTL_PAUSE_SMTP);
+ CASE(IMSG_CTL_PROFILE);
+ CASE(IMSG_CTL_PROFILE_DISABLE);
+ CASE(IMSG_CTL_PROFILE_ENABLE);
CASE(IMSG_CTL_RESUME_EVP);
CASE(IMSG_CTL_RESUME_MDA);
CASE(IMSG_CTL_RESUME_MTA);
CASE(IMSG_CTL_RESUME_SMTP);
CASE(IMSG_CTL_RESUME_ROUTE);
- CASE(IMSG_CTL_LIST_MESSAGES);
- CASE(IMSG_CTL_LIST_ENVELOPES);
CASE(IMSG_CTL_REMOVE);
CASE(IMSG_CTL_SCHEDULE);
CASE(IMSG_CTL_SHOW_STATUS);
+ CASE(IMSG_CTL_SHUTDOWN);
+ CASE(IMSG_CTL_TRACE_DISABLE);
+ CASE(IMSG_CTL_TRACE_ENABLE);
+ CASE(IMSG_CTL_UPDATE_TABLE);
+ CASE(IMSG_CTL_VERBOSE);
- CASE(IMSG_CTL_TRACE);
- CASE(IMSG_CTL_UNTRACE);
- CASE(IMSG_CTL_PROFILE);
- CASE(IMSG_CTL_UNPROFILE);
-
- CASE(IMSG_CTL_MTA_SHOW_HOSTS);
- CASE(IMSG_CTL_MTA_SHOW_RELAYS);
- CASE(IMSG_CTL_MTA_SHOW_ROUTES);
- CASE(IMSG_CTL_MTA_SHOW_HOSTSTATS);
- CASE(IMSG_CTL_MTA_BLOCK);
- CASE(IMSG_CTL_MTA_UNBLOCK);
- CASE(IMSG_CTL_MTA_SHOW_BLOCK);
+ CASE(IMSG_CTL_SMTP_SESSION);
CASE(IMSG_CONF_START);
- CASE(IMSG_CONF_SSL);
- CASE(IMSG_CONF_LISTENER);
- CASE(IMSG_CONF_TABLE);
- CASE(IMSG_CONF_TABLE_CONTENT);
- CASE(IMSG_CONF_RULE);
- CASE(IMSG_CONF_RULE_SOURCE);
- CASE(IMSG_CONF_RULE_SENDER);
- CASE(IMSG_CONF_RULE_DESTINATION);
- CASE(IMSG_CONF_RULE_RECIPIENT);
- CASE(IMSG_CONF_RULE_MAPPING);
- CASE(IMSG_CONF_RULE_USERS);
- CASE(IMSG_CONF_FILTER);
CASE(IMSG_CONF_END);
- CASE(IMSG_LKA_UPDATE_TABLE);
- CASE(IMSG_LKA_EXPAND_RCPT);
- CASE(IMSG_LKA_SECRET);
- CASE(IMSG_LKA_SOURCE);
- CASE(IMSG_LKA_HELO);
- CASE(IMSG_LKA_USERINFO);
- CASE(IMSG_LKA_AUTHENTICATE);
- CASE(IMSG_LKA_SSL_INIT);
- CASE(IMSG_LKA_SSL_VERIFY_CERT);
- CASE(IMSG_LKA_SSL_VERIFY_CHAIN);
- CASE(IMSG_LKA_SSL_VERIFY);
-
- CASE(IMSG_DELIVERY_OK);
- CASE(IMSG_DELIVERY_TEMPFAIL);
- CASE(IMSG_DELIVERY_PERMFAIL);
- CASE(IMSG_DELIVERY_LOOP);
- CASE(IMSG_DELIVERY_HOLD);
- CASE(IMSG_DELIVERY_RELEASE);
-
- CASE(IMSG_BOUNCE_INJECT);
+ CASE(IMSG_STAT_INCREMENT);
+ CASE(IMSG_STAT_DECREMENT);
+ CASE(IMSG_STAT_SET);
- CASE(IMSG_MDA_DELIVER);
+ CASE(IMSG_LKA_AUTHENTICATE);
+ CASE(IMSG_LKA_OPEN_FORWARD);
+ CASE(IMSG_LKA_ENVELOPE_SUBMIT);
+ CASE(IMSG_LKA_ENVELOPE_COMMIT);
+
+ CASE(IMSG_QUEUE_DELIVER);
+ CASE(IMSG_QUEUE_DELIVERY_OK);
+ CASE(IMSG_QUEUE_DELIVERY_TEMPFAIL);
+ CASE(IMSG_QUEUE_DELIVERY_PERMFAIL);
+ CASE(IMSG_QUEUE_DELIVERY_LOOP);
+ CASE(IMSG_QUEUE_ENVELOPE_COMMIT);
+ CASE(IMSG_QUEUE_ENVELOPE_REMOVE);
+ CASE(IMSG_QUEUE_ENVELOPE_SCHEDULE);
+ CASE(IMSG_QUEUE_ENVELOPE_SUBMIT);
+ CASE(IMSG_QUEUE_HOLDQ_HOLD);
+ CASE(IMSG_QUEUE_HOLDQ_RELEASE);
+ CASE(IMSG_QUEUE_MESSAGE_COMMIT);
+ CASE(IMSG_QUEUE_MESSAGE_ROLLBACK);
+ CASE(IMSG_QUEUE_SMTP_SESSION);
+ CASE(IMSG_QUEUE_TRANSFER);
+
+ CASE(IMSG_MDA_DELIVERY_OK);
+ CASE(IMSG_MDA_DELIVERY_TEMPFAIL);
+ CASE(IMSG_MDA_DELIVERY_PERMFAIL);
+ CASE(IMSG_MDA_DELIVERY_LOOP);
+ CASE(IMSG_MDA_DELIVERY_HOLD);
CASE(IMSG_MDA_DONE);
+ CASE(IMSG_MDA_FORK);
+ CASE(IMSG_MDA_HOLDQ_RELEASE);
+ CASE(IMSG_MDA_LOOKUP_USERINFO);
+ CASE(IMSG_MDA_KILL);
+ CASE(IMSG_MDA_OPEN_MESSAGE);
- CASE(IMSG_MFA_REQ_CONNECT);
- CASE(IMSG_MFA_REQ_HELO);
- CASE(IMSG_MFA_REQ_MAIL);
- CASE(IMSG_MFA_REQ_RCPT);
- CASE(IMSG_MFA_REQ_DATA);
- CASE(IMSG_MFA_REQ_EOM);
- CASE(IMSG_MFA_EVENT_RSET);
- CASE(IMSG_MFA_EVENT_COMMIT);
- CASE(IMSG_MFA_EVENT_ROLLBACK);
- CASE(IMSG_MFA_EVENT_DISCONNECT);
CASE(IMSG_MFA_SMTP_RESPONSE);
- CASE(IMSG_MTA_TRANSFER);
+ CASE(IMSG_MTA_DELIVERY_OK);
+ CASE(IMSG_MTA_DELIVERY_TEMPFAIL);
+ CASE(IMSG_MTA_DELIVERY_PERMFAIL);
+ CASE(IMSG_MTA_DELIVERY_LOOP);
+ CASE(IMSG_MTA_DELIVERY_HOLD);
+ CASE(IMSG_MTA_DNS_HOST);
+ CASE(IMSG_MTA_DNS_HOST_END);
+ CASE(IMSG_MTA_DNS_PTR);
+ CASE(IMSG_MTA_DNS_MX);
+ CASE(IMSG_MTA_DNS_MX_PREFERENCE);
+ CASE(IMSG_MTA_HOLDQ_RELEASE);
+ CASE(IMSG_MTA_LOOKUP_CREDENTIALS);
+ CASE(IMSG_MTA_LOOKUP_SOURCE);
+ CASE(IMSG_MTA_LOOKUP_HELO);
+ CASE(IMSG_MTA_OPEN_MESSAGE);
CASE(IMSG_MTA_SCHEDULE);
-
- CASE(IMSG_QUEUE_CREATE_MESSAGE);
- CASE(IMSG_QUEUE_SUBMIT_ENVELOPE);
- CASE(IMSG_QUEUE_COMMIT_ENVELOPES);
- CASE(IMSG_QUEUE_REMOVE_MESSAGE);
- CASE(IMSG_QUEUE_COMMIT_MESSAGE);
- CASE(IMSG_QUEUE_MESSAGE_FD);
- CASE(IMSG_QUEUE_MESSAGE_FILE);
- CASE(IMSG_QUEUE_REMOVE);
- CASE(IMSG_QUEUE_EXPIRE);
- CASE(IMSG_QUEUE_BOUNCE);
-
- CASE(IMSG_PARENT_FORWARD_OPEN);
- CASE(IMSG_PARENT_FORK_MDA);
- CASE(IMSG_PARENT_KILL_MDA);
-
- CASE(IMSG_SMTP_ENQUEUE_FD);
-
- CASE(IMSG_DNS_HOST);
- CASE(IMSG_DNS_HOST_END);
- CASE(IMSG_DNS_PTR);
- CASE(IMSG_DNS_MX);
- CASE(IMSG_DNS_MX_PREFERENCE);
-
- CASE(IMSG_STAT_INCREMENT);
- CASE(IMSG_STAT_DECREMENT);
- CASE(IMSG_STAT_SET);
-
- CASE(IMSG_DIGEST);
- CASE(IMSG_STATS);
- CASE(IMSG_STATS_GET);
-
+ CASE(IMSG_MTA_SSL_INIT);
+ CASE(IMSG_MTA_SSL_VERIFY_CERT);
+ CASE(IMSG_MTA_SSL_VERIFY_CHAIN);
+ CASE(IMSG_MTA_SSL_VERIFY);
+
+ CASE(IMSG_SCHED_ENVELOPE_BOUNCE);
+ CASE(IMSG_SCHED_ENVELOPE_DELIVER);
+ CASE(IMSG_SCHED_ENVELOPE_EXPIRE);
+ CASE(IMSG_SCHED_ENVELOPE_INJECT);
+ CASE(IMSG_SCHED_ENVELOPE_REMOVE);
+ CASE(IMSG_SCHED_ENVELOPE_TRANSFER);
+
+ CASE(IMSG_SMTP_AUTHENTICATE);
+ CASE(IMSG_SMTP_DNS_PTR);
+ CASE(IMSG_SMTP_MESSAGE_COMMIT);
+ CASE(IMSG_SMTP_MESSAGE_CREATE);
+ CASE(IMSG_SMTP_MESSAGE_ROLLBACK);
+ CASE(IMSG_SMTP_MESSAGE_OPEN);
+ CASE(IMSG_SMTP_EXPAND_RCPT);
+ CASE(IMSG_SMTP_LOOKUP_HELO);
+ CASE(IMSG_SMTP_SSL_INIT);
+ CASE(IMSG_SMTP_SSL_VERIFY_CERT);
+ CASE(IMSG_SMTP_SSL_VERIFY_CHAIN);
+ CASE(IMSG_SMTP_SSL_VERIFY);
+
+ CASE(IMSG_SMTP_REQ_CONNECT);
+ CASE(IMSG_SMTP_REQ_HELO);
+ CASE(IMSG_SMTP_REQ_MAIL);
+ CASE(IMSG_SMTP_REQ_RCPT);
+ CASE(IMSG_SMTP_REQ_DATA);
+ CASE(IMSG_SMTP_REQ_EOM);
+ CASE(IMSG_SMTP_EVENT_RSET);
+ CASE(IMSG_SMTP_EVENT_COMMIT);
+ CASE(IMSG_SMTP_EVENT_ROLLBACK);
+ CASE(IMSG_SMTP_EVENT_DISCONNECT);
default:
snprintf(buf, sizeof(buf), "IMSG_??? (%d)", type);
@@ -1435,25 +1424,17 @@ parent_broadcast_verbose(uint32_t v)
m_add_int(p_lka, v);
m_close(p_lka);
- m_create(p_mda, IMSG_CTL_VERBOSE, 0, 0, -1);
- m_add_int(p_mda, v);
- m_close(p_mda);
+ m_create(p_pony, IMSG_CTL_VERBOSE, 0, 0, -1);
+ m_add_int(p_pony, v);
+ m_close(p_pony);
m_create(p_mfa, IMSG_CTL_VERBOSE, 0, 0, -1);
m_add_int(p_mfa, v);
m_close(p_mfa);
- m_create(p_mta, IMSG_CTL_VERBOSE, 0, 0, -1);
- m_add_int(p_mta, v);
- m_close(p_mta);
-
m_create(p_queue, IMSG_CTL_VERBOSE, 0, 0, -1);
m_add_int(p_queue, v);
m_close(p_queue);
-
- m_create(p_smtp, IMSG_CTL_VERBOSE, 0, 0, -1);
- m_add_int(p_smtp, v);
- m_close(p_smtp);
}
static void
@@ -1463,23 +1444,15 @@ parent_broadcast_profile(uint32_t v)
m_add_int(p_lka, v);
m_close(p_lka);
- m_create(p_mda, IMSG_CTL_PROFILE, 0, 0, -1);
- m_add_int(p_mda, v);
- m_close(p_mda);
+ m_create(p_pony, IMSG_CTL_PROFILE, 0, 0, -1);
+ m_add_int(p_pony, v);
+ m_close(p_pony);
m_create(p_mfa, IMSG_CTL_PROFILE, 0, 0, -1);
m_add_int(p_mfa, v);
m_close(p_mfa);
- m_create(p_mta, IMSG_CTL_PROFILE, 0, 0, -1);
- m_add_int(p_mta, v);
- m_close(p_mta);
-
m_create(p_queue, IMSG_CTL_PROFILE, 0, 0, -1);
m_add_int(p_queue, v);
m_close(p_queue);
-
- m_create(p_smtp, IMSG_CTL_PROFILE, 0, 0, -1);
- m_add_int(p_smtp, v);
- m_close(p_smtp);
}
diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h
index 7b501ee986b..bd453e141ea 100644
--- a/usr.sbin/smtpd/smtpd.h
+++ b/usr.sbin/smtpd/smtpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd.h,v 1.451 2014/03/22 09:41:28 gilles Exp $ */
+/* $OpenBSD: smtpd.h,v 1.452 2014/04/04 16:10:42 eric Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -31,7 +31,7 @@
#define MAILNAME_FILE "/etc/mail/mailname"
#define CA_FILE "/etc/ssl/cert.pem"
-#define PROC_COUNT 10
+#define PROC_COUNT 7
#define MAX_HOPS_COUNT 100
#define DEFAULT_MAX_BODY_SIZE (35*1024*1024)
@@ -45,7 +45,7 @@
#ifndef SMTPD_NAME
#define SMTPD_NAME "OpenSMTPD"
#endif
-#define SMTPD_VERSION "5.4.2"
+#define SMTPD_VERSION "5.4.3"
#define SMTPD_BANNER "220 %s ESMTP %s"
#define SMTPD_SESSION_TIMEOUT 300
#define SMTPD_BACKLOG 5
@@ -150,126 +150,141 @@ union lookup {
* Bump IMSG_VERSION whenever a change is made to enum imsg_type.
* This will ensure that we can never use a wrong version of smtpctl with smtpd.
*/
-#define IMSG_VERSION 9
+#define IMSG_VERSION 10
enum imsg_type {
IMSG_NONE,
- IMSG_CTL_OK, /* answer to smtpctl requests */
+
+ IMSG_CTL_OK,
IMSG_CTL_FAIL,
- IMSG_CTL_SHUTDOWN,
- IMSG_CTL_VERBOSE,
+
+ IMSG_CTL_GET_DIGEST,
+ IMSG_CTL_GET_STATS,
+ IMSG_CTL_LIST_MESSAGES,
+ IMSG_CTL_LIST_ENVELOPES,
+ IMSG_CTL_MTA_SHOW_HOSTS,
+ IMSG_CTL_MTA_SHOW_RELAYS,
+ IMSG_CTL_MTA_SHOW_ROUTES,
+ IMSG_CTL_MTA_SHOW_HOSTSTATS,
+ IMSG_CTL_MTA_BLOCK,
+ IMSG_CTL_MTA_UNBLOCK,
+ IMSG_CTL_MTA_SHOW_BLOCK,
IMSG_CTL_PAUSE_EVP,
IMSG_CTL_PAUSE_MDA,
IMSG_CTL_PAUSE_MTA,
IMSG_CTL_PAUSE_SMTP,
+ IMSG_CTL_PROFILE,
+ IMSG_CTL_PROFILE_DISABLE,
+ IMSG_CTL_PROFILE_ENABLE,
IMSG_CTL_RESUME_EVP,
IMSG_CTL_RESUME_MDA,
IMSG_CTL_RESUME_MTA,
IMSG_CTL_RESUME_SMTP,
IMSG_CTL_RESUME_ROUTE,
- IMSG_CTL_LIST_MESSAGES,
- IMSG_CTL_LIST_ENVELOPES,
IMSG_CTL_REMOVE,
IMSG_CTL_SCHEDULE,
IMSG_CTL_SHOW_STATUS,
+ IMSG_CTL_SHUTDOWN,
+ IMSG_CTL_TRACE_DISABLE,
+ IMSG_CTL_TRACE_ENABLE,
+ IMSG_CTL_UPDATE_TABLE,
+ IMSG_CTL_VERBOSE,
- IMSG_CTL_TRACE,
- IMSG_CTL_UNTRACE,
- IMSG_CTL_PROFILE,
- IMSG_CTL_UNPROFILE,
-
- IMSG_CTL_MTA_SHOW_HOSTS,
- IMSG_CTL_MTA_SHOW_RELAYS,
- IMSG_CTL_MTA_SHOW_ROUTES,
- IMSG_CTL_MTA_SHOW_HOSTSTATS,
- IMSG_CTL_MTA_BLOCK,
- IMSG_CTL_MTA_UNBLOCK,
- IMSG_CTL_MTA_SHOW_BLOCK,
+ IMSG_CTL_SMTP_SESSION,
IMSG_CONF_START,
- IMSG_CONF_SSL,
- IMSG_CONF_LISTENER,
- IMSG_CONF_TABLE,
- IMSG_CONF_TABLE_CONTENT,
- IMSG_CONF_RULE,
- IMSG_CONF_RULE_SOURCE,
- IMSG_CONF_RULE_SENDER,
- IMSG_CONF_RULE_DESTINATION,
- IMSG_CONF_RULE_RECIPIENT,
- IMSG_CONF_RULE_MAPPING,
- IMSG_CONF_RULE_USERS,
- IMSG_CONF_FILTER,
IMSG_CONF_END,
- IMSG_LKA_UPDATE_TABLE,
- IMSG_LKA_EXPAND_RCPT,
- IMSG_LKA_SECRET,
- IMSG_LKA_SOURCE,
- IMSG_LKA_HELO,
- IMSG_LKA_USERINFO,
- IMSG_LKA_AUTHENTICATE,
- IMSG_LKA_SSL_INIT,
- IMSG_LKA_SSL_VERIFY_CERT,
- IMSG_LKA_SSL_VERIFY_CHAIN,
- IMSG_LKA_SSL_VERIFY,
-
- IMSG_DELIVERY_OK,
- IMSG_DELIVERY_TEMPFAIL,
- IMSG_DELIVERY_PERMFAIL,
- IMSG_DELIVERY_LOOP,
- IMSG_DELIVERY_HOLD,
- IMSG_DELIVERY_RELEASE,
-
- IMSG_BOUNCE_INJECT,
+ IMSG_STAT_INCREMENT,
+ IMSG_STAT_DECREMENT,
+ IMSG_STAT_SET,
- IMSG_MDA_DELIVER,
+ IMSG_LKA_AUTHENTICATE,
+ IMSG_LKA_OPEN_FORWARD,
+ IMSG_LKA_ENVELOPE_SUBMIT,
+ IMSG_LKA_ENVELOPE_COMMIT,
+
+ IMSG_QUEUE_DELIVER,
+ IMSG_QUEUE_DELIVERY_OK,
+ IMSG_QUEUE_DELIVERY_TEMPFAIL,
+ IMSG_QUEUE_DELIVERY_PERMFAIL,
+ IMSG_QUEUE_DELIVERY_LOOP,
+ IMSG_QUEUE_ENVELOPE_COMMIT,
+ IMSG_QUEUE_ENVELOPE_REMOVE,
+ IMSG_QUEUE_ENVELOPE_SCHEDULE,
+ IMSG_QUEUE_ENVELOPE_SUBMIT,
+ IMSG_QUEUE_HOLDQ_HOLD,
+ IMSG_QUEUE_HOLDQ_RELEASE,
+ IMSG_QUEUE_MESSAGE_COMMIT,
+ IMSG_QUEUE_MESSAGE_ROLLBACK,
+ IMSG_QUEUE_SMTP_SESSION,
+ IMSG_QUEUE_TRANSFER,
+
+ IMSG_MDA_DELIVERY_OK,
+ IMSG_MDA_DELIVERY_TEMPFAIL,
+ IMSG_MDA_DELIVERY_PERMFAIL,
+ IMSG_MDA_DELIVERY_LOOP,
+ IMSG_MDA_DELIVERY_HOLD,
IMSG_MDA_DONE,
+ IMSG_MDA_FORK,
+ IMSG_MDA_HOLDQ_RELEASE,
+ IMSG_MDA_LOOKUP_USERINFO,
+ IMSG_MDA_KILL,
+ IMSG_MDA_OPEN_MESSAGE,
- IMSG_MFA_REQ_CONNECT,
- IMSG_MFA_REQ_HELO,
- IMSG_MFA_REQ_MAIL,
- IMSG_MFA_REQ_RCPT,
- IMSG_MFA_REQ_DATA,
- IMSG_MFA_REQ_EOM,
- IMSG_MFA_EVENT_RSET,
- IMSG_MFA_EVENT_COMMIT,
- IMSG_MFA_EVENT_ROLLBACK,
- IMSG_MFA_EVENT_DISCONNECT,
IMSG_MFA_SMTP_RESPONSE,
- IMSG_MTA_TRANSFER,
+ IMSG_MTA_DELIVERY_OK,
+ IMSG_MTA_DELIVERY_TEMPFAIL,
+ IMSG_MTA_DELIVERY_PERMFAIL,
+ IMSG_MTA_DELIVERY_LOOP,
+ IMSG_MTA_DELIVERY_HOLD,
+ IMSG_MTA_DNS_HOST,
+ IMSG_MTA_DNS_HOST_END,
+ IMSG_MTA_DNS_PTR,
+ IMSG_MTA_DNS_MX,
+ IMSG_MTA_DNS_MX_PREFERENCE,
+ IMSG_MTA_HOLDQ_RELEASE,
+ IMSG_MTA_LOOKUP_CREDENTIALS,
+ IMSG_MTA_LOOKUP_SOURCE,
+ IMSG_MTA_LOOKUP_HELO,
+ IMSG_MTA_OPEN_MESSAGE,
IMSG_MTA_SCHEDULE,
-
- IMSG_QUEUE_CREATE_MESSAGE,
- IMSG_QUEUE_SUBMIT_ENVELOPE,
- IMSG_QUEUE_COMMIT_ENVELOPES,
- IMSG_QUEUE_REMOVE_MESSAGE,
- IMSG_QUEUE_COMMIT_MESSAGE,
- IMSG_QUEUE_MESSAGE_FD,
- IMSG_QUEUE_MESSAGE_FILE,
- IMSG_QUEUE_REMOVE,
- IMSG_QUEUE_EXPIRE,
- IMSG_QUEUE_BOUNCE,
-
- IMSG_PARENT_FORWARD_OPEN,
- IMSG_PARENT_FORK_MDA,
- IMSG_PARENT_KILL_MDA,
-
- IMSG_SMTP_ENQUEUE_FD,
-
- IMSG_DNS_HOST,
- IMSG_DNS_HOST_END,
- IMSG_DNS_PTR,
- IMSG_DNS_MX,
- IMSG_DNS_MX_PREFERENCE,
-
- IMSG_STAT_INCREMENT,
- IMSG_STAT_DECREMENT,
- IMSG_STAT_SET,
-
- IMSG_DIGEST,
- IMSG_STATS,
- IMSG_STATS_GET,
+ IMSG_MTA_SSL_INIT,
+ IMSG_MTA_SSL_VERIFY_CERT,
+ IMSG_MTA_SSL_VERIFY_CHAIN,
+ IMSG_MTA_SSL_VERIFY,
+
+ IMSG_SCHED_ENVELOPE_BOUNCE,
+ IMSG_SCHED_ENVELOPE_DELIVER,
+ IMSG_SCHED_ENVELOPE_EXPIRE,
+ IMSG_SCHED_ENVELOPE_INJECT,
+ IMSG_SCHED_ENVELOPE_REMOVE,
+ IMSG_SCHED_ENVELOPE_TRANSFER,
+
+ IMSG_SMTP_AUTHENTICATE,
+ IMSG_SMTP_DNS_PTR,
+ IMSG_SMTP_MESSAGE_COMMIT,
+ IMSG_SMTP_MESSAGE_CREATE,
+ IMSG_SMTP_MESSAGE_ROLLBACK,
+ IMSG_SMTP_MESSAGE_OPEN,
+ IMSG_SMTP_EXPAND_RCPT,
+ IMSG_SMTP_LOOKUP_HELO,
+ IMSG_SMTP_SSL_INIT,
+ IMSG_SMTP_SSL_VERIFY_CERT,
+ IMSG_SMTP_SSL_VERIFY_CHAIN,
+ IMSG_SMTP_SSL_VERIFY,
+
+ IMSG_SMTP_REQ_CONNECT,
+ IMSG_SMTP_REQ_HELO,
+ IMSG_SMTP_REQ_MAIL,
+ IMSG_SMTP_REQ_RCPT,
+ IMSG_SMTP_REQ_DATA,
+ IMSG_SMTP_REQ_EOM,
+ IMSG_SMTP_EVENT_RSET,
+ IMSG_SMTP_EVENT_COMMIT,
+ IMSG_SMTP_EVENT_ROLLBACK,
+ IMSG_SMTP_EVENT_DISCONNECT,
};
enum blockmodes {
@@ -279,14 +294,12 @@ enum blockmodes {
enum smtp_proc_type {
PROC_PARENT = 0,
- PROC_SMTP,
PROC_MFA,
PROC_LKA,
PROC_QUEUE,
- PROC_MDA,
- PROC_MTA,
PROC_CONTROL,
PROC_SCHEDULER,
+ PROC_PONY,
PROC_FILTER,
PROC_CLIENT,
@@ -961,12 +974,10 @@ extern int profiling;
extern struct mproc *p_control;
extern struct mproc *p_parent;
extern struct mproc *p_lka;
-extern struct mproc *p_mda;
extern struct mproc *p_mfa;
-extern struct mproc *p_mta;
extern struct mproc *p_queue;
extern struct mproc *p_scheduler;
-extern struct mproc *p_smtp;
+extern struct mproc *p_pony;
extern struct smtpd *env;
extern void (*imsg_callback)(struct mproc *, struct imsg *);
@@ -1103,10 +1114,6 @@ struct delivery_backend *delivery_backend_lookup(enum action_type);
/* dns.c */
-void dns_query_host(uint64_t, const char *);
-void dns_query_ptr(uint64_t, const struct sockaddr *);
-void dns_query_mx(uint64_t, const char *);
-void dns_query_mx_preference(uint64_t, const char *, const char *);
void dns_imsg(struct mproc *, struct imsg *);
@@ -1164,13 +1171,16 @@ void vlog(int, const char *, va_list);
/* mda.c */
-pid_t mda(void);
+void mda_postfork(void);
+void mda_postprivdrop(void);
+void mda_imsg(struct mproc *, struct imsg *);
/* mfa.c */
pid_t mfa(void);
void mfa_ready(void);
+
/* mfa_session.c */
void mfa_filter_prepare(void);
void mfa_filter_init(void);
@@ -1183,6 +1193,7 @@ void mfa_filter(uint64_t, int);
void mfa_filter_event(uint64_t, int);
void mfa_build_fd_chain(uint64_t, int);
+
/* mproc.c */
int mproc_fork(struct mproc *, const char*, const char *);
void mproc_init(struct mproc *, int);
@@ -1225,7 +1236,9 @@ void m_get_envelope(struct msg *, struct envelope *);
/* mta.c */
-pid_t mta(void);
+void mta_postfork(void);
+void mta_postprivdrop(void);
+void mta_imsg(struct mproc *, struct imsg *);
void mta_route_ok(struct mta_relay *, struct mta_route *);
void mta_route_error(struct mta_relay *, struct mta_route *);
void mta_route_down(struct mta_relay *, struct mta_route *);
@@ -1249,10 +1262,6 @@ int cmdline_symset(char *);
/* queue.c */
pid_t queue(void);
-void queue_ok(uint64_t);
-void queue_tempfail(uint64_t, const char *, enum enhanced_status_code);
-void queue_permfail(uint64_t, const char *, enum enhanced_status_code);
-void queue_loop(uint64_t);
void queue_flow_control(void);
@@ -1287,8 +1296,15 @@ void scheduler_info(struct scheduler_info *, struct envelope *);
time_t scheduler_compute_schedule(struct scheduler_info *);
+/* pony.c */
+pid_t pony(void);
+
+
/* smtp.c */
-pid_t smtp(void);
+void smtp_postfork(void);
+void smtp_postprivdrop(void);
+void smtp_imsg(struct mproc *, struct imsg *);
+void smtp_configure(void);
void smtp_collect(void);
diff --git a/usr.sbin/smtpd/smtpd/Makefile b/usr.sbin/smtpd/smtpd/Makefile
index b5e6bdeaf28..23dcb8de4e2 100644
--- a/usr.sbin/smtpd/smtpd/Makefile
+++ b/usr.sbin/smtpd/smtpd/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.71 2014/04/01 23:14:25 fgsch Exp $
+# $OpenBSD: Makefile,v 1.72 2014/04/04 16:10:42 eric Exp $
.PATH: ${.CURDIR}/..
@@ -8,7 +8,7 @@ SRCS= aliases.c bounce.c ca.c compress_backend.c config.c \
control.c crypto.c delivery.c dict.c dns.c envelope.c esc.c \
expand.c forward.c iobuf.c ioev.c limit.c lka.c lka_session.c \
log.c mda.c mfa.c mfa_session.c mproc.c \
- mta.c mta_session.c parse.y queue.c queue_backend.c \
+ mta.c mta_session.c parse.y pony.c queue.c queue_backend.c \
ruleset.c runq.c scheduler.c scheduler_backend.c \
smtp.c smtp_session.c smtpd.c ssl.c ssl_privsep.c \
ssl_smtpd.c stat_backend.c table.c to.c tree.c util.c \