Index | Thread | Search

From:
Martijn van Duren <openbsd+tech@list.imperialat.at>
Subject:
smtpd: start with the deckchairs
To:
tech@openbsd.org
Date:
Fri, 5 Jun 2026 16:07:57 +0200

Download raw body.

Thread
EHLO tech@,

I'm currently running with a diff that greatly reduces the amount of the
amount of SRCS per new binary. To create something with the least amount
of logic changes I want to create a main() per binary which is derived
from the current main(). This also means that the functions required by
main() inside smtpd.c need to be moved to a more suitable location.

This first diff moves log_imsg(), proc_title(), proc_name(), and
imsg_to_str() into util.c. There's other functions that need to be
moved, but those need their own file, since they would pull in a
dependency hell into the other binaries that now include util.c.

OK?

martijn@

diff c7a21344ea409a87e0b5948decc9b0a0effe7481 5e8d775f0ae5d3ec31c40491e7c42ac35dd34f01
commit - c7a21344ea409a87e0b5948decc9b0a0effe7481
commit + 5e8d775f0ae5d3ec31c40491e7c42ac35dd34f01
blob - 2609be577a05081685109df0d923427e22230189
blob + cb86d6a6aee03def5aefe6a702a6f9155df5ac21
--- usr.sbin/smtpd/smtpd.c
+++ usr.sbin/smtpd/smtpd.c
@@ -1883,254 +1883,6 @@ imsg_dispatch(struct mproc *p, struct imsg *imsg)
 	}
 }
 
-void
-log_imsg(int to, int from, struct imsg *imsg)
-{
-
-	if (to == PROC_CONTROL && imsg->hdr.type == IMSG_STAT_SET)
-		return;
-
-	log_trace(TRACE_IMSG, "imsg: %s <- %s: %s (len=%zu)",
-	    proc_name(to),
-	    proc_name(from),
-	    imsg_to_str(imsg->hdr.type),
-	    imsg->hdr.len - IMSG_HEADER_SIZE);
-}
-
-const char *
-proc_title(enum smtp_proc_type proc)
-{
-	switch (proc) {
-	case PROC_PARENT:
-		return "[priv]";
-	case PROC_LKA:
-		return "lookup";
-	case PROC_QUEUE:
-		return "queue";
-	case PROC_CONTROL:
-		return "control";
-	case PROC_SCHEDULER:
-		return "scheduler";
-	case PROC_DISPATCHER:
-		return "dispatcher";
-	case PROC_CA:
-		return "crypto";
-	case PROC_CLIENT:
-		return "client";
-	case PROC_PROCESSOR:
-		return "processor";
-	}
-	return "unknown";
-}
-
-const char *
-proc_name(enum smtp_proc_type proc)
-{
-	switch (proc) {
-	case PROC_PARENT:
-		return "parent";
-	case PROC_LKA:
-		return "lka";
-	case PROC_QUEUE:
-		return "queue";
-	case PROC_CONTROL:
-		return "control";
-	case PROC_SCHEDULER:
-		return "scheduler";
-	case PROC_DISPATCHER:
-		return "dispatcher";
-	case PROC_CA:
-		return "ca";
-	case PROC_CLIENT:
-		return "client-proc";
-	default:
-		return "unknown";
-	}
-}
-
-#define CASE(x) case x : return #x
-
-const char *
-imsg_to_str(int type)
-{
-	static char	 buf[32];
-
-	switch (type) {
-	CASE(IMSG_NONE);
-
-	CASE(IMSG_CTL_OK);
-	CASE(IMSG_CTL_FAIL);
-
-	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_REMOVE);
-	CASE(IMSG_CTL_SCHEDULE);
-	CASE(IMSG_CTL_SHOW_STATUS);
-	CASE(IMSG_CTL_TRACE_DISABLE);
-	CASE(IMSG_CTL_TRACE_ENABLE);
-	CASE(IMSG_CTL_UPDATE_TABLE);
-	CASE(IMSG_CTL_VERBOSE);
-	CASE(IMSG_CTL_DISCOVER_EVPID);
-	CASE(IMSG_CTL_DISCOVER_MSGID);
-
-	CASE(IMSG_CTL_SMTP_SESSION);
-
-	CASE(IMSG_GETADDRINFO);
-	CASE(IMSG_GETADDRINFO_END);
-	CASE(IMSG_GETNAMEINFO);
-	CASE(IMSG_RES_QUERY);
-
-	CASE(IMSG_SETUP_KEY);
-	CASE(IMSG_SETUP_PEER);
-	CASE(IMSG_SETUP_DONE);
-
-	CASE(IMSG_CONF_START);
-	CASE(IMSG_CONF_END);
-
-	CASE(IMSG_STAT_INCREMENT);
-	CASE(IMSG_STAT_DECREMENT);
-	CASE(IMSG_STAT_SET);
-
-	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_DISCOVER_EVPID);
-	CASE(IMSG_QUEUE_DISCOVER_MSGID);
-	CASE(IMSG_QUEUE_ENVELOPE_ACK);
-	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_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_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_LOOKUP_SMARTHOST);
-	CASE(IMSG_MTA_OPEN_MESSAGE);
-	CASE(IMSG_MTA_SCHEDULE);
-
-	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_MESSAGE_COMMIT);
-	CASE(IMSG_SMTP_MESSAGE_CREATE);
-	CASE(IMSG_SMTP_MESSAGE_ROLLBACK);
-	CASE(IMSG_SMTP_MESSAGE_OPEN);
-	CASE(IMSG_SMTP_CHECK_SENDER);
-	CASE(IMSG_SMTP_EXPAND_RCPT);
-	CASE(IMSG_SMTP_LOOKUP_HELO);
-
-	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);
-
-	CASE(IMSG_LKA_PROCESSOR_FORK);
-	CASE(IMSG_LKA_PROCESSOR_ERRFD);
-
-	CASE(IMSG_REPORT_SMTP_LINK_CONNECT);
-	CASE(IMSG_REPORT_SMTP_LINK_DISCONNECT);
-	CASE(IMSG_REPORT_SMTP_LINK_GREETING);
-	CASE(IMSG_REPORT_SMTP_LINK_IDENTIFY);
-	CASE(IMSG_REPORT_SMTP_LINK_TLS);
-	CASE(IMSG_REPORT_SMTP_LINK_AUTH);
-	CASE(IMSG_REPORT_SMTP_TX_RESET);
-	CASE(IMSG_REPORT_SMTP_TX_BEGIN);
-	CASE(IMSG_REPORT_SMTP_TX_MAIL);
-	CASE(IMSG_REPORT_SMTP_TX_RCPT);
-	CASE(IMSG_REPORT_SMTP_TX_ENVELOPE);
-	CASE(IMSG_REPORT_SMTP_TX_DATA);
-	CASE(IMSG_REPORT_SMTP_TX_COMMIT);
-	CASE(IMSG_REPORT_SMTP_TX_ROLLBACK);
-	CASE(IMSG_REPORT_SMTP_PROTOCOL_CLIENT);
-	CASE(IMSG_REPORT_SMTP_PROTOCOL_SERVER);
-	CASE(IMSG_REPORT_SMTP_FILTER_RESPONSE);
-	CASE(IMSG_REPORT_SMTP_TIMEOUT);
-
-	CASE(IMSG_FILTER_SMTP_BEGIN);
-	CASE(IMSG_FILTER_SMTP_END);
-	CASE(IMSG_FILTER_SMTP_PROTOCOL);
-	CASE(IMSG_FILTER_SMTP_DATA_BEGIN);
-	CASE(IMSG_FILTER_SMTP_DATA_END);
-
-	CASE(IMSG_CA_RSA_PRIVENC);
-	CASE(IMSG_CA_RSA_PRIVDEC);
-	CASE(IMSG_CA_ECDSA_SIGN);
-
-	default:
-		(void)snprintf(buf, sizeof(buf), "IMSG_??? (%d)", type);
-
-		return buf;
-	}
-}
-
 int
 parent_auth_user(const char *username, const char *password)
 {
blob - 9058e4c36c4a06411f713e822ff1e0e350d69ee5
blob + fa5d31d6926331c11978f0abab5809bad60909b6
--- usr.sbin/smtpd/smtpd.h
+++ usr.sbin/smtpd/smtpd.h
@@ -1606,10 +1606,6 @@ void smtp_session_imsg(struct mproc *, struct imsg *);
 
 /* smtpd.c */
 void imsg_dispatch(struct mproc *, struct imsg *);
-const char *proc_name(enum smtp_proc_type);
-const char *proc_title(enum smtp_proc_type);
-const char *imsg_to_str(int);
-void log_imsg(int, int, struct imsg *);
 int fork_proc_backend(const char *, const char *, const char *, int);
 
 
@@ -1724,6 +1720,10 @@ int base64_decode(char const *, unsigned char *, size_
 int base64_encode_rfc3548(unsigned char const *, size_t,
 		      char *, size_t);
 
+const char *proc_name(enum smtp_proc_type);
+const char *proc_title(enum smtp_proc_type);
+const char *imsg_to_str(int);
+void log_imsg(int, int, struct imsg *);
 void log_trace_verbose(int);
 void log_trace0(const char *, ...)
     __attribute__((format (printf, 1, 2)));
blob - 1a0392c12df3fdc6347670ff8b43308f95e150cd
blob + 3603e29900059f49ab29e51799cc1488844417fb
--- usr.sbin/smtpd/util.c
+++ usr.sbin/smtpd/util.c
@@ -832,7 +832,255 @@ base64_encode_rfc3548(unsigned char const *src, size_t
 	return ret;
 }
 
+#define CASE(x) case x : return #x
+
+const char *
+imsg_to_str(int type)
+{
+	static char	 buf[32];
+
+	switch (type) {
+	CASE(IMSG_NONE);
+
+	CASE(IMSG_CTL_OK);
+	CASE(IMSG_CTL_FAIL);
+
+	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_REMOVE);
+	CASE(IMSG_CTL_SCHEDULE);
+	CASE(IMSG_CTL_SHOW_STATUS);
+	CASE(IMSG_CTL_TRACE_DISABLE);
+	CASE(IMSG_CTL_TRACE_ENABLE);
+	CASE(IMSG_CTL_UPDATE_TABLE);
+	CASE(IMSG_CTL_VERBOSE);
+	CASE(IMSG_CTL_DISCOVER_EVPID);
+	CASE(IMSG_CTL_DISCOVER_MSGID);
+
+	CASE(IMSG_CTL_SMTP_SESSION);
+
+	CASE(IMSG_GETADDRINFO);
+	CASE(IMSG_GETADDRINFO_END);
+	CASE(IMSG_GETNAMEINFO);
+	CASE(IMSG_RES_QUERY);
+
+	CASE(IMSG_SETUP_KEY);
+	CASE(IMSG_SETUP_PEER);
+	CASE(IMSG_SETUP_DONE);
+
+	CASE(IMSG_CONF_START);
+	CASE(IMSG_CONF_END);
+
+	CASE(IMSG_STAT_INCREMENT);
+	CASE(IMSG_STAT_DECREMENT);
+	CASE(IMSG_STAT_SET);
+
+	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_DISCOVER_EVPID);
+	CASE(IMSG_QUEUE_DISCOVER_MSGID);
+	CASE(IMSG_QUEUE_ENVELOPE_ACK);
+	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_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_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_LOOKUP_SMARTHOST);
+	CASE(IMSG_MTA_OPEN_MESSAGE);
+	CASE(IMSG_MTA_SCHEDULE);
+
+	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_MESSAGE_COMMIT);
+	CASE(IMSG_SMTP_MESSAGE_CREATE);
+	CASE(IMSG_SMTP_MESSAGE_ROLLBACK);
+	CASE(IMSG_SMTP_MESSAGE_OPEN);
+	CASE(IMSG_SMTP_CHECK_SENDER);
+	CASE(IMSG_SMTP_EXPAND_RCPT);
+	CASE(IMSG_SMTP_LOOKUP_HELO);
+
+	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);
+
+	CASE(IMSG_LKA_PROCESSOR_FORK);
+	CASE(IMSG_LKA_PROCESSOR_ERRFD);
+
+	CASE(IMSG_REPORT_SMTP_LINK_CONNECT);
+	CASE(IMSG_REPORT_SMTP_LINK_DISCONNECT);
+	CASE(IMSG_REPORT_SMTP_LINK_GREETING);
+	CASE(IMSG_REPORT_SMTP_LINK_IDENTIFY);
+	CASE(IMSG_REPORT_SMTP_LINK_TLS);
+	CASE(IMSG_REPORT_SMTP_LINK_AUTH);
+	CASE(IMSG_REPORT_SMTP_TX_RESET);
+	CASE(IMSG_REPORT_SMTP_TX_BEGIN);
+	CASE(IMSG_REPORT_SMTP_TX_MAIL);
+	CASE(IMSG_REPORT_SMTP_TX_RCPT);
+	CASE(IMSG_REPORT_SMTP_TX_ENVELOPE);
+	CASE(IMSG_REPORT_SMTP_TX_DATA);
+	CASE(IMSG_REPORT_SMTP_TX_COMMIT);
+	CASE(IMSG_REPORT_SMTP_TX_ROLLBACK);
+	CASE(IMSG_REPORT_SMTP_PROTOCOL_CLIENT);
+	CASE(IMSG_REPORT_SMTP_PROTOCOL_SERVER);
+	CASE(IMSG_REPORT_SMTP_FILTER_RESPONSE);
+	CASE(IMSG_REPORT_SMTP_TIMEOUT);
+
+	CASE(IMSG_FILTER_SMTP_BEGIN);
+	CASE(IMSG_FILTER_SMTP_END);
+	CASE(IMSG_FILTER_SMTP_PROTOCOL);
+	CASE(IMSG_FILTER_SMTP_DATA_BEGIN);
+	CASE(IMSG_FILTER_SMTP_DATA_END);
+
+	CASE(IMSG_CA_RSA_PRIVENC);
+	CASE(IMSG_CA_RSA_PRIVDEC);
+	CASE(IMSG_CA_ECDSA_SIGN);
+
+	default:
+		(void)snprintf(buf, sizeof(buf), "IMSG_??? (%d)", type);
+
+		return buf;
+	}
+}
+
+const char *
+proc_title(enum smtp_proc_type proc)
+{
+	switch (proc) {
+	case PROC_PARENT:
+		return "[priv]";
+	case PROC_LKA:
+		return "lookup";
+	case PROC_QUEUE:
+		return "queue";
+	case PROC_CONTROL:
+		return "control";
+	case PROC_SCHEDULER:
+		return "scheduler";
+	case PROC_DISPATCHER:
+		return "dispatcher";
+	case PROC_CA:
+		return "crypto";
+	case PROC_CLIENT:
+		return "client";
+	case PROC_PROCESSOR:
+		return "processor";
+	}
+	return "unknown";
+}
+
+const char *
+proc_name(enum smtp_proc_type proc)
+{
+	switch (proc) {
+	case PROC_PARENT:
+		return "parent";
+	case PROC_LKA:
+		return "lka";
+	case PROC_QUEUE:
+		return "queue";
+	case PROC_CONTROL:
+		return "control";
+	case PROC_SCHEDULER:
+		return "scheduler";
+	case PROC_DISPATCHER:
+		return "dispatcher";
+	case PROC_CA:
+		return "ca";
+	case PROC_CLIENT:
+		return "client-proc";
+	default:
+		return "unknown";
+	}
+}
+
 void
+log_imsg(int to, int from, struct imsg *imsg)
+{
+
+	if (to == PROC_CONTROL && imsg->hdr.type == IMSG_STAT_SET)
+		return;
+
+	log_trace(TRACE_IMSG, "imsg: %s <- %s: %s (len=%zu)",
+	    proc_name(to),
+	    proc_name(from),
+	    imsg_to_str(imsg->hdr.type),
+	    imsg->hdr.len - IMSG_HEADER_SIZE);
+}
+
+void
 log_trace0(const char *emsg, ...)
 {
 	va_list	 ap;