diff options
author | 2014-04-04 16:10:41 +0000 | |
---|---|---|
committer | 2014-04-04 16:10:41 +0000 | |
commit | aa1d5973d3dfd2f62aa2af3e94d0c8b82d0c1cfb (patch) | |
tree | 29658804ec99019911733177eb2c64c816355b50 | |
parent | Remember which names are in the NAME section. (diff) | |
download | wireguard-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.c | 24 | ||||
-rw-r--r-- | usr.sbin/smtpd/config.c | 14 | ||||
-rw-r--r-- | usr.sbin/smtpd/control.c | 64 | ||||
-rw-r--r-- | usr.sbin/smtpd/dns.c | 66 | ||||
-rw-r--r-- | usr.sbin/smtpd/enqueue.c | 4 | ||||
-rw-r--r-- | usr.sbin/smtpd/lka.c | 87 | ||||
-rw-r--r-- | usr.sbin/smtpd/lka_session.c | 22 | ||||
-rw-r--r-- | usr.sbin/smtpd/mda.c | 182 | ||||
-rw-r--r-- | usr.sbin/smtpd/mfa.c | 47 | ||||
-rw-r--r-- | usr.sbin/smtpd/mfa_session.c | 22 | ||||
-rw-r--r-- | usr.sbin/smtpd/mta.c | 191 | ||||
-rw-r--r-- | usr.sbin/smtpd/mta_session.c | 59 | ||||
-rw-r--r-- | usr.sbin/smtpd/pony.c | 222 | ||||
-rw-r--r-- | usr.sbin/smtpd/queue.c | 195 | ||||
-rw-r--r-- | usr.sbin/smtpd/scheduler.c | 34 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtp.c | 118 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtp_session.c | 103 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtpctl.c | 18 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtpd.c | 349 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtpd.h | 242 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtpd/Makefile | 4 |
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 \ |