smtpd.h revision 1.623
1/*	$OpenBSD: smtpd.h,v 1.623 2019/06/13 11:45:35 eric Exp $	*/
2
3/*
4 * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
6 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21#ifndef nitems
22#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
23#endif
24
25#include <netinet/in.h>
26#include <netdb.h>
27#include <event.h>
28
29#include "smtpd-defines.h"
30#include "smtpd-api.h"
31#include "ioev.h"
32
33#define CHECK_IMSG_DATA_SIZE(imsg, expected_sz) do {			\
34	if ((imsg)->hdr.len - IMSG_HEADER_SIZE != (expected_sz))	\
35		fatalx("smtpd: imsg %d: data size expected %zd got %zd",\
36	   	    (imsg)->hdr.type,					\
37	   	    (expected_sz), (imsg)->hdr.len - IMSG_HEADER_SIZE);	\
38} while (0)
39
40#define CONF_FILE		 "/etc/mail/smtpd.conf"
41#define MAILNAME_FILE		 "/etc/mail/mailname"
42#define CA_FILE			 "/etc/ssl/cert.pem"
43
44#define PROC_COUNT		 7
45
46#define MAX_HOPS_COUNT		 100
47#define	DEFAULT_MAX_BODY_SIZE	(35*1024*1024)
48
49#define	EXPAND_BUFFER		 1024
50
51#define SMTPD_QUEUE_EXPIRY	 (4 * 24 * 60 * 60)
52#define SMTPD_SOCKET		 "/var/run/smtpd.sock"
53#define	SMTPD_NAME		 "OpenSMTPD"
54#define	SMTPD_VERSION		 "6.5.0"
55#define SMTPD_SESSION_TIMEOUT	 300
56#define SMTPD_BACKLOG		 5
57
58#define	PATH_SMTPCTL		"/usr/sbin/smtpctl"
59
60#define PATH_OFFLINE		"/offline"
61#define PATH_PURGE		"/purge"
62#define PATH_TEMPORARY		"/temporary"
63
64#define	PATH_LIBEXEC		"/usr/local/libexec/smtpd"
65
66
67/*
68 * RFC 5322 defines these characters as valid, some of them are
69 * potentially dangerous and need to be escaped.
70 */
71#define	MAILADDR_ALLOWED       	"!#$%&'*/?^`{|}~+-=_"
72#define	MAILADDR_ESCAPE		"!#$%&'*/?^`{|}~"
73
74
75#define F_STARTTLS		0x01
76#define F_SMTPS			0x02
77#define F_SSL		       (F_STARTTLS | F_SMTPS)
78#define F_AUTH			0x08
79#define	F_STARTTLS_REQUIRE	0x20
80#define	F_AUTH_REQUIRE		0x40
81#define	F_MASK_SOURCE		0x100
82#define	F_TLS_VERIFY		0x200
83#define	F_EXT_DSN		0x400
84#define	F_RECEIVEDAUTH		0x800
85#define	F_MASQUERADE		0x1000
86#define	F_FILTERED		0x2000
87
88#define RELAY_TLS_OPPORTUNISTIC	0
89#define RELAY_TLS_STARTTLS	1
90#define RELAY_TLS_SMTPS		2
91#define RELAY_TLS_NO		3
92
93#define RELAY_AUTH		0x08
94#define RELAY_LMTP		0x80
95#define	RELAY_TLS_VERIFY	0x200
96
97#define MTA_EXT_DSN		0x400
98
99
100#define P_NEWALIASES	0
101#define P_MAKEMAP	1
102
103#define	CERT_ERROR	-1
104#define	CERT_OK		 0
105#define	CERT_NOCA	 1
106#define	CERT_NOCERT	 2
107#define	CERT_INVALID	 3
108
109struct userinfo {
110	char username[SMTPD_VUSERNAME_SIZE];
111	char directory[PATH_MAX];
112	uid_t uid;
113	gid_t gid;
114};
115
116struct netaddr {
117	struct sockaddr_storage ss;
118	int bits;
119};
120
121struct relayhost {
122	uint16_t flags;
123	int tls;
124	char hostname[HOST_NAME_MAX+1];
125	uint16_t port;
126	char authlabel[PATH_MAX];
127};
128
129struct credentials {
130	char username[LINE_MAX];
131	char password[LINE_MAX];
132};
133
134struct destination {
135	char	name[HOST_NAME_MAX+1];
136};
137
138struct source {
139	struct sockaddr_storage	addr;
140};
141
142struct addrname {
143	struct sockaddr_storage	addr;
144	char			name[HOST_NAME_MAX+1];
145};
146
147union lookup {
148	struct expand		*expand;
149	struct credentials	 creds;
150	struct netaddr		 netaddr;
151	struct source		 source;
152	struct destination	 domain;
153	struct userinfo		 userinfo;
154	struct mailaddr		 mailaddr;
155	struct addrname		 addrname;
156	struct maddrmap		*maddrmap;
157	char			 relayhost[LINE_MAX];
158};
159
160/*
161 * Bump IMSG_VERSION whenever a change is made to enum imsg_type.
162 * This will ensure that we can never use a wrong version of smtpctl with smtpd.
163 */
164#define	IMSG_VERSION		16
165
166enum imsg_type {
167	IMSG_NONE,
168
169	IMSG_CTL_OK,
170	IMSG_CTL_FAIL,
171
172	IMSG_CTL_GET_DIGEST,
173	IMSG_CTL_GET_STATS,
174	IMSG_CTL_LIST_MESSAGES,
175	IMSG_CTL_LIST_ENVELOPES,
176	IMSG_CTL_MTA_SHOW_HOSTS,
177	IMSG_CTL_MTA_SHOW_RELAYS,
178	IMSG_CTL_MTA_SHOW_ROUTES,
179	IMSG_CTL_MTA_SHOW_HOSTSTATS,
180	IMSG_CTL_MTA_BLOCK,
181	IMSG_CTL_MTA_UNBLOCK,
182	IMSG_CTL_MTA_SHOW_BLOCK,
183	IMSG_CTL_PAUSE_EVP,
184	IMSG_CTL_PAUSE_MDA,
185	IMSG_CTL_PAUSE_MTA,
186	IMSG_CTL_PAUSE_SMTP,
187	IMSG_CTL_PROFILE,
188	IMSG_CTL_PROFILE_DISABLE,
189	IMSG_CTL_PROFILE_ENABLE,
190	IMSG_CTL_RESUME_EVP,
191	IMSG_CTL_RESUME_MDA,
192	IMSG_CTL_RESUME_MTA,
193	IMSG_CTL_RESUME_SMTP,
194	IMSG_CTL_RESUME_ROUTE,
195	IMSG_CTL_REMOVE,
196	IMSG_CTL_SCHEDULE,
197	IMSG_CTL_SHOW_STATUS,
198	IMSG_CTL_TRACE_DISABLE,
199	IMSG_CTL_TRACE_ENABLE,
200	IMSG_CTL_UPDATE_TABLE,
201	IMSG_CTL_VERBOSE,
202	IMSG_CTL_DISCOVER_EVPID,
203	IMSG_CTL_DISCOVER_MSGID,
204
205	IMSG_CTL_SMTP_SESSION,
206
207	IMSG_GETADDRINFO,
208	IMSG_GETADDRINFO_END,
209	IMSG_GETNAMEINFO,
210	IMSG_RES_QUERY,
211
212	IMSG_CERT_INIT,
213	IMSG_CERT_CERTIFICATE,
214	IMSG_CERT_VERIFY,
215
216	IMSG_SETUP_KEY,
217	IMSG_SETUP_PEER,
218	IMSG_SETUP_DONE,
219
220	IMSG_CONF_START,
221	IMSG_CONF_END,
222
223	IMSG_STAT_INCREMENT,
224	IMSG_STAT_DECREMENT,
225	IMSG_STAT_SET,
226
227	IMSG_LKA_AUTHENTICATE,
228	IMSG_LKA_OPEN_FORWARD,
229	IMSG_LKA_ENVELOPE_SUBMIT,
230	IMSG_LKA_ENVELOPE_COMMIT,
231
232	IMSG_QUEUE_DELIVER,
233	IMSG_QUEUE_DELIVERY_OK,
234	IMSG_QUEUE_DELIVERY_TEMPFAIL,
235	IMSG_QUEUE_DELIVERY_PERMFAIL,
236	IMSG_QUEUE_DELIVERY_LOOP,
237	IMSG_QUEUE_DISCOVER_EVPID,
238	IMSG_QUEUE_DISCOVER_MSGID,
239	IMSG_QUEUE_ENVELOPE_ACK,
240	IMSG_QUEUE_ENVELOPE_COMMIT,
241	IMSG_QUEUE_ENVELOPE_REMOVE,
242	IMSG_QUEUE_ENVELOPE_SCHEDULE,
243	IMSG_QUEUE_ENVELOPE_SUBMIT,
244	IMSG_QUEUE_HOLDQ_HOLD,
245	IMSG_QUEUE_HOLDQ_RELEASE,
246	IMSG_QUEUE_MESSAGE_COMMIT,
247	IMSG_QUEUE_MESSAGE_ROLLBACK,
248	IMSG_QUEUE_SMTP_SESSION,
249	IMSG_QUEUE_TRANSFER,
250
251	IMSG_MDA_DELIVERY_OK,
252	IMSG_MDA_DELIVERY_TEMPFAIL,
253	IMSG_MDA_DELIVERY_PERMFAIL,
254	IMSG_MDA_DELIVERY_LOOP,
255	IMSG_MDA_DELIVERY_HOLD,
256	IMSG_MDA_DONE,
257	IMSG_MDA_FORK,
258	IMSG_MDA_HOLDQ_RELEASE,
259	IMSG_MDA_LOOKUP_USERINFO,
260	IMSG_MDA_KILL,
261	IMSG_MDA_OPEN_MESSAGE,
262
263	IMSG_MTA_DELIVERY_OK,
264	IMSG_MTA_DELIVERY_TEMPFAIL,
265	IMSG_MTA_DELIVERY_PERMFAIL,
266	IMSG_MTA_DELIVERY_LOOP,
267	IMSG_MTA_DELIVERY_HOLD,
268	IMSG_MTA_DNS_HOST,
269	IMSG_MTA_DNS_HOST_END,
270	IMSG_MTA_DNS_MX,
271	IMSG_MTA_DNS_MX_PREFERENCE,
272	IMSG_MTA_HOLDQ_RELEASE,
273	IMSG_MTA_LOOKUP_CREDENTIALS,
274	IMSG_MTA_LOOKUP_SOURCE,
275	IMSG_MTA_LOOKUP_HELO,
276	IMSG_MTA_LOOKUP_SMARTHOST,
277	IMSG_MTA_OPEN_MESSAGE,
278	IMSG_MTA_SCHEDULE,
279
280	IMSG_SCHED_ENVELOPE_BOUNCE,
281	IMSG_SCHED_ENVELOPE_DELIVER,
282	IMSG_SCHED_ENVELOPE_EXPIRE,
283	IMSG_SCHED_ENVELOPE_INJECT,
284	IMSG_SCHED_ENVELOPE_REMOVE,
285	IMSG_SCHED_ENVELOPE_TRANSFER,
286
287	IMSG_SMTP_AUTHENTICATE,
288	IMSG_SMTP_MESSAGE_COMMIT,
289	IMSG_SMTP_MESSAGE_CREATE,
290	IMSG_SMTP_MESSAGE_ROLLBACK,
291	IMSG_SMTP_MESSAGE_OPEN,
292	IMSG_SMTP_CHECK_SENDER,
293	IMSG_SMTP_EXPAND_RCPT,
294	IMSG_SMTP_LOOKUP_HELO,
295
296	IMSG_SMTP_REQ_CONNECT,
297	IMSG_SMTP_REQ_HELO,
298	IMSG_SMTP_REQ_MAIL,
299	IMSG_SMTP_REQ_RCPT,
300	IMSG_SMTP_REQ_DATA,
301	IMSG_SMTP_REQ_EOM,
302	IMSG_SMTP_EVENT_RSET,
303	IMSG_SMTP_EVENT_COMMIT,
304	IMSG_SMTP_EVENT_ROLLBACK,
305	IMSG_SMTP_EVENT_DISCONNECT,
306
307	IMSG_LKA_PROCESSOR_FORK,
308
309	IMSG_REPORT_SMTP_LINK_CONNECT,
310	IMSG_REPORT_SMTP_LINK_DISCONNECT,
311	IMSG_REPORT_SMTP_LINK_IDENTIFY,
312	IMSG_REPORT_SMTP_LINK_TLS,
313	IMSG_REPORT_SMTP_TX_BEGIN,
314	IMSG_REPORT_SMTP_TX_MAIL,
315	IMSG_REPORT_SMTP_TX_RCPT,
316	IMSG_REPORT_SMTP_TX_ENVELOPE,
317	IMSG_REPORT_SMTP_TX_DATA,
318	IMSG_REPORT_SMTP_TX_COMMIT,
319	IMSG_REPORT_SMTP_TX_ROLLBACK,
320	IMSG_REPORT_SMTP_PROTOCOL_CLIENT,
321	IMSG_REPORT_SMTP_PROTOCOL_SERVER,
322	IMSG_REPORT_SMTP_FILTER_RESPONSE,
323	IMSG_REPORT_SMTP_TIMEOUT,
324
325	IMSG_FILTER_SMTP_BEGIN,
326	IMSG_FILTER_SMTP_END,
327	IMSG_FILTER_SMTP_PROTOCOL,
328	IMSG_FILTER_SMTP_DATA_BEGIN,
329	IMSG_FILTER_SMTP_DATA_END,
330
331	IMSG_CA_RSA_PRIVENC,
332	IMSG_CA_RSA_PRIVDEC,
333	IMSG_CA_ECDSA_SIGN,
334};
335
336enum smtp_proc_type {
337	PROC_PARENT = 0,
338	PROC_LKA,
339	PROC_QUEUE,
340	PROC_CONTROL,
341	PROC_SCHEDULER,
342	PROC_PONY,
343	PROC_CA,
344	PROC_PROCESSOR,
345	PROC_CLIENT,
346};
347
348enum table_type {
349	T_NONE		= 0,
350	T_DYNAMIC	= 0x01,	/* table with external source	*/
351	T_LIST		= 0x02,	/* table holding a list		*/
352	T_HASH		= 0x04,	/* table holding a hash table	*/
353};
354
355struct table {
356	char				 t_name[LINE_MAX];
357	enum table_type			 t_type;
358	char				 t_config[PATH_MAX];
359
360	void				*t_handle;
361	struct table_backend		*t_backend;
362};
363
364struct table_backend {
365	const char *name;
366	const unsigned int	services;
367	int	(*config)(struct table *);
368	int	(*add)(struct table *, const char *, const char *);
369	void	(*dump)(struct table *);
370	int	(*open)(struct table *);
371	int	(*update)(struct table *);
372	void	(*close)(struct table *);
373	int	(*lookup)(struct table *, enum table_service, const char *, char **);
374	int	(*fetch)(struct table *, enum table_service, char **);
375};
376
377
378enum bounce_type {
379	B_FAILED,
380	B_DELAYED,
381	B_DELIVERED
382};
383
384enum dsn_ret {
385	DSN_RETFULL = 1,
386	DSN_RETHDRS
387};
388
389struct delivery_bounce {
390	enum bounce_type	type;
391	time_t			delay;
392	time_t			ttl;
393	enum dsn_ret		dsn_ret;
394        int			mta_without_dsn;
395};
396
397enum expand_type {
398	EXPAND_INVALID,
399	EXPAND_USERNAME,
400	EXPAND_FILENAME,
401	EXPAND_FILTER,
402	EXPAND_INCLUDE,
403	EXPAND_ADDRESS,
404	EXPAND_ERROR,
405};
406
407enum filter_phase {
408	FILTER_CONNECT,
409	FILTER_HELO,
410	FILTER_EHLO,
411	FILTER_STARTTLS,
412	FILTER_AUTH,
413	FILTER_MAIL_FROM,
414	FILTER_RCPT_TO,
415	FILTER_DATA,
416	FILTER_DATA_LINE,
417	FILTER_RSET,
418	FILTER_QUIT,
419	FILTER_NOOP,
420	FILTER_HELP,
421	FILTER_WIZ,
422	FILTER_COMMIT,
423	FILTER_PHASES_COUNT     /* must be last */
424};
425
426struct expandnode {
427	RB_ENTRY(expandnode)	entry;
428	TAILQ_ENTRY(expandnode)	tq_entry;
429	enum expand_type	type;
430	int			sameuser;
431	int			realuser;
432	int			forwarded;
433	struct rule	       *rule;
434	struct expandnode      *parent;
435	unsigned int		depth;
436	union {
437		/*
438		 * user field handles both expansion user and system user
439		 * so we MUST make it large enough to fit a mailaddr user
440		 */
441		char		user[SMTPD_MAXLOCALPARTSIZE];
442		char		buffer[EXPAND_BUFFER];
443		struct mailaddr	mailaddr;
444	}			u;
445	char		subaddress[SMTPD_SUBADDRESS_SIZE];
446};
447
448struct expand {
449	RB_HEAD(expandtree, expandnode)	 tree;
450	TAILQ_HEAD(xnodes, expandnode)	*queue;
451	size_t				 nb_nodes;
452	struct rule			*rule;
453	struct expandnode		*parent;
454};
455
456struct maddrnode {
457	TAILQ_ENTRY(maddrnode)		entries;
458	struct mailaddr			mailaddr;
459};
460
461struct maddrmap {
462	TAILQ_HEAD(xmaddr, maddrnode)	queue;
463};
464
465#define DSN_SUCCESS 0x01
466#define DSN_FAILURE 0x02
467#define DSN_DELAY   0x04
468#define DSN_NEVER   0x08
469
470#define	DSN_ENVID_LEN	100
471
472#define	SMTPD_ENVELOPE_VERSION		3
473struct envelope {
474	TAILQ_ENTRY(envelope)		entry;
475
476	char				dispatcher[HOST_NAME_MAX+1];
477
478	char				tag[SMTPD_TAG_SIZE];
479
480	uint32_t			version;
481	uint64_t			id;
482	enum envelope_flags		flags;
483
484	char				smtpname[HOST_NAME_MAX+1];
485	char				helo[HOST_NAME_MAX+1];
486	char				hostname[HOST_NAME_MAX+1];
487	char				errorline[LINE_MAX];
488	struct sockaddr_storage		ss;
489
490	struct mailaddr			sender;
491	struct mailaddr			rcpt;
492	struct mailaddr			dest;
493
494	char				mda_user[SMTPD_VUSERNAME_SIZE];
495	char				mda_subaddress[SMTPD_SUBADDRESS_SIZE];
496	char				mda_exec[LINE_MAX];
497
498	enum delivery_type		type;
499	union {
500		struct delivery_bounce	bounce;
501	}				agent;
502
503	uint16_t			retry;
504	time_t				creation;
505	time_t				ttl;
506	time_t				lasttry;
507	time_t				nexttry;
508	time_t				lastbounce;
509
510	struct mailaddr			dsn_orcpt;
511	char				dsn_envid[DSN_ENVID_LEN+1];
512	uint8_t				dsn_notify;
513	enum dsn_ret			dsn_ret;
514
515	uint8_t				esc_class;
516	uint8_t				esc_code;
517};
518
519struct listener {
520	uint16_t       		 flags;
521	int			 fd;
522	struct sockaddr_storage	 ss;
523	in_port_t		 port;
524	struct timeval		 timeout;
525	struct event		 ev;
526	char			 filter_name[PATH_MAX];
527	char			 pki_name[PATH_MAX];
528	char			 ca_name[PATH_MAX];
529	char			 tag[SMTPD_TAG_SIZE];
530	char			 authtable[LINE_MAX];
531	char			 hostname[HOST_NAME_MAX+1];
532	char			 hostnametable[PATH_MAX];
533	char			 sendertable[PATH_MAX];
534
535	TAILQ_ENTRY(listener)	 entry;
536
537	int			 local;		/* there must be a better way */
538};
539
540struct smtpd {
541	char				sc_conffile[PATH_MAX];
542	size_t				sc_maxsize;
543
544#define SMTPD_OPT_VERBOSE		0x00000001
545#define SMTPD_OPT_NOACTION		0x00000002
546	uint32_t			sc_opts;
547
548#define SMTPD_EXITING			0x00000001 /* unused */
549#define SMTPD_MDA_PAUSED		0x00000002
550#define SMTPD_MTA_PAUSED		0x00000004
551#define SMTPD_SMTP_PAUSED		0x00000008
552#define SMTPD_MDA_BUSY			0x00000010
553#define SMTPD_MTA_BUSY			0x00000020
554#define SMTPD_BOUNCE_BUSY		0x00000040
555#define SMTPD_SMTP_DISABLED		0x00000080
556	uint32_t			sc_flags;
557
558#define QUEUE_COMPRESSION      		0x00000001
559#define QUEUE_ENCRYPTION      		0x00000002
560#define QUEUE_EVPCACHE			0x00000004
561	uint32_t			sc_queue_flags;
562	char			       *sc_queue_key;
563	size_t				sc_queue_evpcache_size;
564
565	size_t				sc_session_max_rcpt;
566	size_t				sc_session_max_mails;
567
568	struct dict		       *sc_mda_wrappers;
569	size_t				sc_mda_max_session;
570	size_t				sc_mda_max_user_session;
571	size_t				sc_mda_task_hiwat;
572	size_t				sc_mda_task_lowat;
573	size_t				sc_mda_task_release;
574
575	size_t				sc_mta_max_deferred;
576
577	size_t				sc_scheduler_max_inflight;
578	size_t				sc_scheduler_max_evp_batch_size;
579	size_t				sc_scheduler_max_msg_batch_size;
580	size_t				sc_scheduler_max_schedule;
581
582	struct dict		       *sc_processors_dict;
583
584	int				sc_ttl;
585#define MAX_BOUNCE_WARN			4
586	time_t				sc_bounce_warn[MAX_BOUNCE_WARN];
587	char				sc_hostname[HOST_NAME_MAX+1];
588	struct stat_backend	       *sc_stat;
589	struct compress_backend	       *sc_comp;
590
591	time_t					 sc_uptime;
592
593	/* This is a listener for a local socket used by smtp_enqueue(). */
594	struct listener                         *sc_sock_listener;
595
596	TAILQ_HEAD(listenerlist, listener)	*sc_listeners;
597
598	TAILQ_HEAD(rulelist, rule)		*sc_rules;
599
600
601	struct dict				*sc_filters_dict;
602	struct dict				*sc_dispatchers;
603	struct dispatcher			*sc_dispatcher_bounce;
604
605	struct dict			       *sc_ca_dict;
606	struct dict			       *sc_pki_dict;
607	struct dict			       *sc_ssl_dict;
608
609	struct dict			       *sc_tables_dict;		/* keyed lookup	*/
610
611	struct dict			       *sc_limits_dict;
612
613	char				       *sc_tls_ciphers;
614
615	char				       *sc_subaddressing_delim;
616};
617
618#define	TRACE_DEBUG	0x0001
619#define	TRACE_IMSG	0x0002
620#define	TRACE_IO	0x0004
621#define	TRACE_SMTP	0x0008
622#define	TRACE_FILTERS	0x0010
623#define	TRACE_MTA	0x0020
624#define	TRACE_BOUNCE	0x0040
625#define	TRACE_SCHEDULER	0x0080
626#define	TRACE_LOOKUP	0x0100
627#define	TRACE_STAT	0x0200
628#define	TRACE_RULES	0x0400
629#define	TRACE_MPROC	0x0800
630#define	TRACE_EXPAND	0x1000
631#define	TRACE_TABLES	0x2000
632#define	TRACE_QUEUE	0x4000
633
634#define PROFILE_TOSTAT	0x0001
635#define PROFILE_IMSG	0x0002
636#define PROFILE_QUEUE	0x0004
637
638struct forward_req {
639	uint64_t			id;
640	uint8_t				status;
641
642	char				user[SMTPD_VUSERNAME_SIZE];
643	uid_t				uid;
644	gid_t				gid;
645	char				directory[PATH_MAX];
646};
647
648struct deliver {
649	char			dispatcher[EXPAND_BUFFER];
650
651	struct mailaddr		sender;
652	struct mailaddr		rcpt;
653	struct mailaddr		dest;
654
655	char			mda_subaddress[SMTPD_SUBADDRESS_SIZE];
656	char			mda_exec[LINE_MAX];
657
658	struct userinfo		userinfo;
659};
660
661struct mta_host {
662	SPLAY_ENTRY(mta_host)	 entry;
663	struct sockaddr		*sa;
664	char			*ptrname;
665	int			 refcount;
666	size_t			 nconn;
667	time_t			 lastconn;
668	time_t			 lastptrquery;
669
670#define HOST_IGNORE	0x01
671	int			 flags;
672};
673
674struct mta_mx {
675	TAILQ_ENTRY(mta_mx)	 entry;
676	struct mta_host		*host;
677	int			 preference;
678};
679
680struct mta_domain {
681	SPLAY_ENTRY(mta_domain)	 entry;
682	char			*name;
683	int			 as_host;
684	TAILQ_HEAD(, mta_mx)	 mxs;
685	int			 mxstatus;
686	int			 refcount;
687	size_t			 nconn;
688	time_t			 lastconn;
689	time_t			 lastmxquery;
690};
691
692struct mta_source {
693	SPLAY_ENTRY(mta_source)	 entry;
694	struct sockaddr		*sa;
695	int			 refcount;
696	size_t			 nconn;
697	time_t			 lastconn;
698};
699
700struct mta_connector {
701	struct mta_source		*source;
702	struct mta_relay		*relay;
703
704#define CONNECTOR_ERROR_FAMILY		0x0001
705#define CONNECTOR_ERROR_SOURCE		0x0002
706#define CONNECTOR_ERROR_MX		0x0004
707#define CONNECTOR_ERROR_ROUTE_NET	0x0008
708#define CONNECTOR_ERROR_ROUTE_SMTP	0x0010
709#define CONNECTOR_ERROR_ROUTE		0x0018
710#define CONNECTOR_ERROR_BLOCKED		0x0020
711#define CONNECTOR_ERROR			0x00ff
712
713#define CONNECTOR_LIMIT_HOST		0x0100
714#define CONNECTOR_LIMIT_ROUTE		0x0200
715#define CONNECTOR_LIMIT_SOURCE		0x0400
716#define CONNECTOR_LIMIT_RELAY		0x0800
717#define CONNECTOR_LIMIT_CONN		0x1000
718#define CONNECTOR_LIMIT_DOMAIN		0x2000
719#define CONNECTOR_LIMIT			0xff00
720
721#define CONNECTOR_NEW			0x10000
722#define CONNECTOR_WAIT			0x20000
723	int				 flags;
724
725	int				 refcount;
726	size_t				 nconn;
727	time_t				 lastconn;
728};
729
730struct mta_route {
731	SPLAY_ENTRY(mta_route)	 entry;
732	uint64_t		 id;
733	struct mta_source	*src;
734	struct mta_host		*dst;
735#define ROUTE_NEW		0x01
736#define ROUTE_RUNQ		0x02
737#define ROUTE_KEEPALIVE		0x04
738#define ROUTE_DISABLED		0xf0
739#define ROUTE_DISABLED_NET	0x10
740#define ROUTE_DISABLED_SMTP	0x20
741	int			 flags;
742	int			 nerror;
743	int			 penalty;
744	int			 refcount;
745	size_t			 nconn;
746	time_t			 lastconn;
747	time_t			 lastdisc;
748	time_t			 lastpenalty;
749};
750
751struct mta_limits {
752	size_t	maxconn_per_host;
753	size_t	maxconn_per_route;
754	size_t	maxconn_per_source;
755	size_t	maxconn_per_connector;
756	size_t	maxconn_per_relay;
757	size_t	maxconn_per_domain;
758
759	time_t	conndelay_host;
760	time_t	conndelay_route;
761	time_t	conndelay_source;
762	time_t	conndelay_connector;
763	time_t	conndelay_relay;
764	time_t	conndelay_domain;
765
766	time_t	discdelay_route;
767
768	size_t	max_mail_per_session;
769	time_t	sessdelay_transaction;
770	time_t	sessdelay_keepalive;
771
772	size_t	max_failures_per_session;
773
774	int	family;
775
776	int	task_hiwat;
777	int	task_lowat;
778	int	task_release;
779};
780
781struct mta_relay {
782	SPLAY_ENTRY(mta_relay)	 entry;
783	uint64_t		 id;
784
785	struct dispatcher	*dispatcher;
786	struct mta_domain	*domain;
787	struct mta_limits	*limits;
788	int			 tls;
789	int			 flags;
790	char			*backupname;
791	int			 backuppref;
792	char			*sourcetable;
793	uint16_t		 port;
794	char			*pki_name;
795	char			*ca_name;
796	char			*authtable;
797	char			*authlabel;
798	char			*helotable;
799	char			*heloname;
800	char			*secret;
801
802	int			 state;
803	size_t			 ntask;
804	TAILQ_HEAD(, mta_task)	 tasks;
805
806	struct tree		 connectors;
807	size_t			 sourceloop;
808	time_t			 lastsource;
809	time_t			 nextsource;
810
811	int			 fail;
812	char			*failstr;
813
814#define RELAY_WAIT_MX		0x01
815#define RELAY_WAIT_PREFERENCE	0x02
816#define RELAY_WAIT_SECRET	0x04
817#define RELAY_WAIT_LIMITS	0x08
818#define RELAY_WAIT_SOURCE	0x10
819#define RELAY_WAIT_CONNECTOR	0x20
820#define RELAY_WAIT_SMARTHOST	0x40
821#define RELAY_WAITMASK		0x7f
822	int			 status;
823
824	int			 refcount;
825	size_t			 nconn;
826	size_t			 nconn_ready;
827	time_t			 lastconn;
828};
829
830struct mta_envelope {
831	TAILQ_ENTRY(mta_envelope)	 entry;
832	uint64_t			 id;
833	uint64_t			 session;
834	time_t				 creation;
835	char				*smtpname;
836	char				*dest;
837	char				*rcpt;
838	struct mta_task			*task;
839	int				 delivery;
840
841	int				 ext;
842	char				*dsn_orcpt;
843	char				dsn_envid[DSN_ENVID_LEN+1];
844	uint8_t				dsn_notify;
845	enum dsn_ret			dsn_ret;
846
847	char				 status[LINE_MAX];
848};
849
850struct mta_task {
851	TAILQ_ENTRY(mta_task)		 entry;
852	struct mta_relay		*relay;
853	uint32_t			 msgid;
854	TAILQ_HEAD(, mta_envelope)	 envelopes;
855	char				*sender;
856};
857
858struct passwd;
859
860struct queue_backend {
861	int	(*init)(struct passwd *, int, const char *);
862};
863
864struct compress_backend {
865	size_t	(*compress_chunk)(void *, size_t, void *, size_t);
866	size_t	(*uncompress_chunk)(void *, size_t, void *, size_t);
867	int	(*compress_file)(FILE *, FILE *);
868	int	(*uncompress_file)(FILE *, FILE *);
869};
870
871/* auth structures */
872enum auth_type {
873	AUTH_BSD,
874	AUTH_PWD,
875};
876
877struct auth_backend {
878	int	(*authenticate)(char *, char *);
879};
880
881struct scheduler_backend {
882	int	(*init)(const char *);
883
884	int	(*insert)(struct scheduler_info *);
885	size_t	(*commit)(uint32_t);
886	size_t	(*rollback)(uint32_t);
887
888	int	(*update)(struct scheduler_info *);
889	int	(*delete)(uint64_t);
890	int	(*hold)(uint64_t, uint64_t);
891	int	(*release)(int, uint64_t, int);
892
893	int	(*batch)(int, int*, size_t*, uint64_t*, int*);
894
895	size_t	(*messages)(uint32_t, uint32_t *, size_t);
896	size_t	(*envelopes)(uint64_t, struct evpstate *, size_t);
897	int	(*schedule)(uint64_t);
898	int	(*remove)(uint64_t);
899	int	(*suspend)(uint64_t);
900	int	(*resume)(uint64_t);
901	int	(*query)(uint64_t);
902};
903
904enum stat_type {
905	STAT_COUNTER,
906	STAT_TIMESTAMP,
907	STAT_TIMEVAL,
908	STAT_TIMESPEC,
909};
910
911struct stat_value {
912	enum stat_type	type;
913	union stat_v {
914		size_t		counter;
915		time_t		timestamp;
916		struct timeval	tv;
917		struct timespec	ts;
918	} u;
919};
920
921#define	STAT_KEY_SIZE	1024
922struct stat_kv {
923	void	*iter;
924	char	key[STAT_KEY_SIZE];
925	struct stat_value	val;
926};
927
928struct stat_backend {
929	void	(*init)(void);
930	void	(*close)(void);
931	void	(*increment)(const char *, size_t);
932	void	(*decrement)(const char *, size_t);
933	void	(*set)(const char *, const struct stat_value *);
934	int	(*iter)(void **, char **, struct stat_value *);
935};
936
937struct stat_digest {
938	time_t			 startup;
939	time_t			 timestamp;
940
941	size_t			 clt_connect;
942	size_t			 clt_disconnect;
943
944	size_t			 evp_enqueued;
945	size_t			 evp_dequeued;
946
947	size_t			 evp_expired;
948	size_t			 evp_removed;
949	size_t			 evp_bounce;
950
951	size_t			 dlv_ok;
952	size_t			 dlv_permfail;
953	size_t			 dlv_tempfail;
954	size_t			 dlv_loop;
955};
956
957
958struct mproc {
959	pid_t		 pid;
960	char		*name;
961	int		 proc;
962	void		(*handler)(struct mproc *, struct imsg *);
963	struct imsgbuf	 imsgbuf;
964
965	char		*m_buf;
966	size_t		 m_alloc;
967	size_t		 m_pos;
968	uint32_t	 m_type;
969	uint32_t	 m_peerid;
970	pid_t		 m_pid;
971	int		 m_fd;
972
973	int		 enable;
974	short		 events;
975	struct event	 ev;
976	void		*data;
977};
978
979struct msg {
980	const uint8_t	*pos;
981	const uint8_t	*end;
982};
983
984extern enum smtp_proc_type	smtpd_process;
985
986extern int tracing;
987extern int foreground_log;
988extern int profiling;
989
990extern struct mproc *p_control;
991extern struct mproc *p_parent;
992extern struct mproc *p_lka;
993extern struct mproc *p_queue;
994extern struct mproc *p_scheduler;
995extern struct mproc *p_pony;
996extern struct mproc *p_ca;
997
998extern struct smtpd	*env;
999extern void (*imsg_callback)(struct mproc *, struct imsg *);
1000
1001/* inter-process structures */
1002
1003struct bounce_req_msg {
1004	uint64_t		evpid;
1005	time_t			timestamp;
1006	struct delivery_bounce	bounce;
1007};
1008
1009enum dns_error {
1010	DNS_OK = 0,
1011	DNS_RETRY,
1012	DNS_EINVAL,
1013	DNS_ENONAME,
1014	DNS_ENOTFOUND,
1015};
1016
1017enum lka_resp_status {
1018	LKA_OK,
1019	LKA_TEMPFAIL,
1020	LKA_PERMFAIL
1021};
1022
1023struct processor {
1024	const char		       *command;
1025	const char		       *user;
1026	const char		       *group;
1027	const char		       *chroot;
1028};
1029
1030enum filter_type {
1031	FILTER_TYPE_BUILTIN,
1032	FILTER_TYPE_PROC,
1033	FILTER_TYPE_CHAIN,
1034};
1035
1036struct filter_config {
1037	char			       *name;
1038	enum filter_type		filter_type;
1039	enum filter_phase               phase;
1040	char                           *reject;
1041	char                           *disconnect;
1042	char                           *rewrite;
1043	char                           *proc;
1044
1045	const char		      **chain;
1046	size_t				chain_size;
1047	struct dict			chain_procs;
1048
1049	int8_t				not_fcrdns;
1050	int8_t				fcrdns;
1051
1052	int8_t				not_rdns;
1053	int8_t				rdns;
1054
1055	int8_t                          not_rdns_table;
1056	struct table                   *rdns_table;
1057
1058	int8_t                          not_rdns_regex;
1059	struct table                   *rdns_regex;
1060
1061	int8_t                          not_src_table;
1062	struct table                   *src_table;
1063
1064	int8_t                          not_src_regex;
1065	struct table                   *src_regex;
1066
1067	int8_t                          not_helo_table;
1068	struct table                   *helo_table;
1069
1070	int8_t                          not_helo_regex;
1071	struct table                   *helo_regex;
1072
1073	int8_t                          not_mail_from_table;
1074	struct table                   *mail_from_table;
1075
1076	int8_t                          not_mail_from_regex;
1077	struct table                   *mail_from_regex;
1078
1079	int8_t                          not_rcpt_to_table;
1080	struct table                   *rcpt_to_table;
1081
1082	int8_t                          not_rcpt_to_regex;
1083	struct table                   *rcpt_to_regex;
1084
1085};
1086
1087enum filter_status {
1088	FILTER_PROCEED,
1089	FILTER_REWRITE,
1090	FILTER_REJECT,
1091	FILTER_DISCONNECT,
1092};
1093
1094enum ca_resp_status {
1095	CA_OK,
1096	CA_FAIL
1097};
1098
1099enum mda_resp_status {
1100	MDA_OK,
1101	MDA_TEMPFAIL,
1102	MDA_PERMFAIL
1103};
1104
1105struct msg_walkinfo {
1106	struct event	 ev;
1107	uint32_t	 msgid;
1108	uint32_t	 peerid;
1109	size_t		 n_evp;
1110	void		*data;
1111	int		 done;
1112};
1113
1114
1115enum dispatcher_type {
1116	DISPATCHER_LOCAL,
1117	DISPATCHER_REMOTE,
1118	DISPATCHER_BOUNCE,
1119};
1120
1121struct dispatcher_local {
1122	uint8_t requires_root;	/* only for MBOX */
1123
1124	uint8_t	expand_only;
1125	uint8_t	forward_only;
1126
1127	char	*mda_wrapper;
1128	char	*command;
1129
1130	char	*table_alias;
1131	char	*table_virtual;
1132	char	*table_userbase;
1133
1134	char	*user;
1135};
1136
1137struct dispatcher_remote {
1138	char	*helo;
1139	char	*helo_source;
1140
1141	char	*source;
1142
1143	char	*ca;
1144	char	*pki;
1145
1146	char	*mail_from;
1147
1148	char	*smarthost;
1149	char	*auth;
1150	int	 tls_required;
1151	int	 tls_noverify;
1152
1153	int	 backup;
1154	char	*backupmx;
1155};
1156
1157struct dispatcher_bounce {
1158};
1159
1160struct dispatcher {
1161	enum dispatcher_type			type;
1162	union dispatcher_agent {
1163		struct dispatcher_local		local;
1164		struct dispatcher_remote  	remote;
1165		struct dispatcher_bounce  	bounce;
1166	} u;
1167
1168	time_t	ttl;
1169};
1170
1171struct rule {
1172	TAILQ_ENTRY(rule)	r_entry;
1173
1174	uint8_t	reject;
1175
1176	int8_t	flag_tag;
1177	int8_t	flag_from;
1178	int8_t	flag_for;
1179	int8_t	flag_from_rdns;
1180	int8_t	flag_from_socket;
1181
1182	int8_t	flag_tag_regex;
1183	int8_t	flag_from_regex;
1184	int8_t	flag_for_regex;
1185
1186	int8_t	flag_smtp_helo;
1187	int8_t	flag_smtp_starttls;
1188	int8_t	flag_smtp_auth;
1189	int8_t	flag_smtp_mail_from;
1190	int8_t	flag_smtp_rcpt_to;
1191
1192	int8_t	flag_smtp_helo_regex;
1193	int8_t	flag_smtp_starttls_regex;
1194	int8_t	flag_smtp_auth_regex;
1195	int8_t	flag_smtp_mail_from_regex;
1196	int8_t	flag_smtp_rcpt_to_regex;
1197
1198
1199	char	*table_tag;
1200	char	*table_from;
1201	char	*table_for;
1202
1203	char	*table_smtp_helo;
1204	char	*table_smtp_auth;
1205	char	*table_smtp_mail_from;
1206	char	*table_smtp_rcpt_to;
1207
1208	char	*dispatcher;
1209};
1210
1211
1212/* aliases.c */
1213int aliases_get(struct expand *, const char *);
1214int aliases_virtual_get(struct expand *, const struct mailaddr *);
1215int alias_parse(struct expandnode *, const char *);
1216
1217
1218/* auth.c */
1219struct auth_backend *auth_backend_lookup(enum auth_type);
1220
1221
1222/* bounce.c */
1223void bounce_add(uint64_t);
1224void bounce_fd(int);
1225
1226
1227/* ca.c */
1228int	 ca(void);
1229int	 ca_X509_verify(void *, void *, const char *, const char *, const char **);
1230void	 ca_imsg(struct mproc *, struct imsg *);
1231void	 ca_init(void);
1232void	 ca_engine_init(void);
1233
1234
1235/* cert.c */
1236int cert_init(const char *, int,
1237    void (*)(void *, int, const char *, const void *, size_t), void *);
1238int cert_verify(const void *, const char *, int, void (*)(void *, int), void *);
1239void cert_dispatch_request(struct mproc *, struct imsg *);
1240void cert_dispatch_result(struct mproc *, struct imsg *);
1241
1242
1243/* compress_backend.c */
1244struct compress_backend *compress_backend_lookup(const char *);
1245size_t	compress_chunk(void *, size_t, void *, size_t);
1246size_t	uncompress_chunk(void *, size_t, void *, size_t);
1247int	compress_file(FILE *, FILE *);
1248int	uncompress_file(FILE *, FILE *);
1249
1250/* config.c */
1251#define PURGE_LISTENERS		0x01
1252#define PURGE_TABLES		0x02
1253#define PURGE_RULES		0x04
1254#define PURGE_PKI		0x08
1255#define PURGE_PKI_KEYS		0x10
1256#define PURGE_DISPATCHERS	0x20
1257#define PURGE_EVERYTHING	0xff
1258struct smtpd *config_default(void);
1259void purge_config(uint8_t);
1260void config_process(enum smtp_proc_type);
1261void config_peer(enum smtp_proc_type);
1262
1263
1264/* control.c */
1265int control(void);
1266int control_create_socket(void);
1267
1268
1269/* crypto.c */
1270int	crypto_setup(const char *, size_t);
1271int	crypto_encrypt_file(FILE *, FILE *);
1272int	crypto_decrypt_file(FILE *, FILE *);
1273size_t	crypto_encrypt_buffer(const char *, size_t, char *, size_t);
1274size_t	crypto_decrypt_buffer(const char *, size_t, char *, size_t);
1275
1276
1277/* dns.c */
1278void dns_imsg(struct mproc *, struct imsg *);
1279
1280
1281/* enqueue.c */
1282int		 enqueue(int, char **, FILE *);
1283
1284
1285/* envelope.c */
1286void envelope_set_errormsg(struct envelope *, char *, ...);
1287void envelope_set_esc_class(struct envelope *, enum enhanced_status_class);
1288void envelope_set_esc_code(struct envelope *, enum enhanced_status_code);
1289int envelope_load_buffer(struct envelope *, const char *, size_t);
1290int envelope_dump_buffer(const struct envelope *, char *, size_t);
1291
1292
1293/* expand.c */
1294int expand_cmp(struct expandnode *, struct expandnode *);
1295void expand_insert(struct expand *, struct expandnode *);
1296struct expandnode *expand_lookup(struct expand *, struct expandnode *);
1297void expand_clear(struct expand *);
1298void expand_free(struct expand *);
1299int expand_line(struct expand *, const char *, int);
1300int expand_to_text(struct expand *, char *, size_t);
1301RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp);
1302
1303
1304/* forward.c */
1305int forwards_get(int, struct expand *);
1306
1307
1308/* limit.c */
1309void limit_mta_set_defaults(struct mta_limits *);
1310int limit_mta_set(struct mta_limits *, const char*, int64_t);
1311
1312
1313/* lka.c */
1314int lka(void);
1315
1316
1317/* lka_proc.c */
1318int lka_proc_ready(void);
1319void lka_proc_forked(const char *, int);
1320struct io *lka_proc_get_io(const char *);
1321
1322
1323/* lka_report.c */
1324void lka_report_init(void);
1325void lka_report_register_hook(const char *, const char *);
1326void lka_report_smtp_link_connect(const char *, struct timeval *, uint64_t, const char *, int,
1327    const struct sockaddr_storage *, const struct sockaddr_storage *);
1328void lka_report_smtp_link_disconnect(const char *, struct timeval *, uint64_t);
1329void lka_report_smtp_link_identify(const char *, struct timeval *, uint64_t, const char *);
1330void lka_report_smtp_link_tls(const char *, struct timeval *, uint64_t, const char *);
1331void lka_report_smtp_tx_begin(const char *, struct timeval *, uint64_t, uint32_t);
1332void lka_report_smtp_tx_mail(const char *, struct timeval *, uint64_t, uint32_t, const char *, int);
1333void lka_report_smtp_tx_rcpt(const char *, struct timeval *, uint64_t, uint32_t, const char *, int);
1334void lka_report_smtp_tx_envelope(const char *, struct timeval *, uint64_t, uint32_t, uint64_t);
1335void lka_report_smtp_tx_commit(const char *, struct timeval *, uint64_t, uint32_t, size_t);
1336void lka_report_smtp_tx_data(const char *, struct timeval *, uint64_t, uint32_t, int);
1337void lka_report_smtp_tx_rollback(const char *, struct timeval *, uint64_t, uint32_t);
1338void lka_report_smtp_protocol_client(const char *, struct timeval *, uint64_t, const char *);
1339void lka_report_smtp_protocol_server(const char *, struct timeval *, uint64_t, const char *);
1340void lka_report_smtp_filter_response(const char *, struct timeval *, uint64_t,
1341    int, int, const char *);
1342void lka_report_smtp_timeout(const char *, struct timeval *, uint64_t);
1343
1344
1345/* lka_filter.c */
1346void lka_filter_init(void);
1347void lka_filter_register_hook(const char *, const char *);
1348void lka_filter_ready(void);
1349int lka_filter_proc_in_session(uint64_t, const char *);
1350void lka_filter_begin(uint64_t, const char *, const struct sockaddr_storage *, const struct sockaddr_storage *, const char *, int);
1351void lka_filter_end(uint64_t);
1352void lka_filter_protocol(uint64_t, enum filter_phase, const char *);
1353void lka_filter_data_begin(uint64_t);
1354void lka_filter_data_end(uint64_t);
1355int lka_filter_response(uint64_t, const char *, const char *);
1356
1357
1358/* lka_session.c */
1359void lka_session(uint64_t, struct envelope *);
1360void lka_session_forward_reply(struct forward_req *, int);
1361
1362
1363/* log.c */
1364void vlog(int, const char *, va_list);
1365void logit(int, const char *, ...) __attribute__((format (printf, 2, 3)));
1366
1367
1368/* mda.c */
1369void mda_postfork(void);
1370void mda_postprivdrop(void);
1371void mda_imsg(struct mproc *, struct imsg *);
1372
1373
1374/* mda_unpriv.c */
1375void mda_unpriv(struct dispatcher *, struct deliver *, const char *, const char *);
1376
1377
1378/* mda_variables.c */
1379ssize_t mda_expand_format(char *, size_t, const struct deliver *,
1380    const struct userinfo *, const char *);
1381
1382
1383/* makemap.c */
1384int makemap(int, int, char **);
1385
1386
1387/* mailaddr.c */
1388int mailaddr_line(struct maddrmap *, const char *);
1389void maddrmap_init(struct maddrmap *);
1390void maddrmap_insert(struct maddrmap *, struct maddrnode *);
1391void maddrmap_free(struct maddrmap *);
1392
1393
1394/* mproc.c */
1395int mproc_fork(struct mproc *, const char*, char **);
1396void mproc_init(struct mproc *, int);
1397void mproc_clear(struct mproc *);
1398void mproc_enable(struct mproc *);
1399void mproc_disable(struct mproc *);
1400void mproc_event_add(struct mproc *);
1401void m_compose(struct mproc *, uint32_t, uint32_t, pid_t, int, void *, size_t);
1402void m_composev(struct mproc *, uint32_t, uint32_t, pid_t, int,
1403    const struct iovec *, int);
1404void m_forward(struct mproc *, struct imsg *);
1405void m_create(struct mproc *, uint32_t, uint32_t, pid_t, int);
1406void m_add(struct mproc *, const void *, size_t);
1407void m_add_int(struct mproc *, int);
1408void m_add_u32(struct mproc *, uint32_t);
1409void m_add_size(struct mproc *, size_t);
1410void m_add_time(struct mproc *, time_t);
1411void m_add_timeval(struct mproc *, struct timeval *tv);
1412void m_add_string(struct mproc *, const char *);
1413void m_add_data(struct mproc *, const void *, size_t);
1414void m_add_evpid(struct mproc *, uint64_t);
1415void m_add_msgid(struct mproc *, uint32_t);
1416void m_add_id(struct mproc *, uint64_t);
1417void m_add_sockaddr(struct mproc *, const struct sockaddr *);
1418void m_add_mailaddr(struct mproc *, const struct mailaddr *);
1419void m_add_envelope(struct mproc *, const struct envelope *);
1420void m_add_params(struct mproc *, struct dict *);
1421void m_close(struct mproc *);
1422void m_flush(struct mproc *);
1423
1424void m_msg(struct msg *, struct imsg *);
1425int  m_is_eom(struct msg *);
1426void m_end(struct msg *);
1427void m_get_int(struct msg *, int *);
1428void m_get_size(struct msg *, size_t *);
1429void m_get_u32(struct msg *, uint32_t *);
1430void m_get_time(struct msg *, time_t *);
1431void m_get_timeval(struct msg *, struct timeval *);
1432void m_get_string(struct msg *, const char **);
1433void m_get_data(struct msg *, const void **, size_t *);
1434void m_get_evpid(struct msg *, uint64_t *);
1435void m_get_msgid(struct msg *, uint32_t *);
1436void m_get_id(struct msg *, uint64_t *);
1437void m_get_sockaddr(struct msg *, struct sockaddr *);
1438void m_get_mailaddr(struct msg *, struct mailaddr *);
1439void m_get_envelope(struct msg *, struct envelope *);
1440void m_get_params(struct msg *, struct dict *);
1441void m_clear_params(struct dict *);
1442
1443
1444/* mta.c */
1445void mta_postfork(void);
1446void mta_postprivdrop(void);
1447void mta_imsg(struct mproc *, struct imsg *);
1448void mta_route_ok(struct mta_relay *, struct mta_route *);
1449void mta_route_error(struct mta_relay *, struct mta_route *);
1450void mta_route_down(struct mta_relay *, struct mta_route *);
1451void mta_route_collect(struct mta_relay *, struct mta_route *);
1452void mta_source_error(struct mta_relay *, struct mta_route *, const char *);
1453void mta_delivery_log(struct mta_envelope *, const char *, const char *, int, const char *);
1454void mta_delivery_notify(struct mta_envelope *);
1455struct mta_task *mta_route_next_task(struct mta_relay *, struct mta_route *);
1456const char *mta_host_to_text(struct mta_host *);
1457const char *mta_relay_to_text(struct mta_relay *);
1458
1459
1460/* mta_session.c */
1461void mta_session(struct mta_relay *, struct mta_route *);
1462void mta_session_imsg(struct mproc *, struct imsg *);
1463
1464
1465/* parse.y */
1466int parse_config(struct smtpd *, const char *, int);
1467int cmdline_symset(char *);
1468
1469
1470/* queue.c */
1471int queue(void);
1472
1473
1474/* queue_backend.c */
1475uint32_t queue_generate_msgid(void);
1476uint64_t queue_generate_evpid(uint32_t);
1477int queue_init(const char *, int);
1478int queue_close(void);
1479int queue_message_create(uint32_t *);
1480int queue_message_delete(uint32_t);
1481int queue_message_commit(uint32_t);
1482int queue_message_fd_r(uint32_t);
1483int queue_message_fd_rw(uint32_t);
1484int queue_envelope_create(struct envelope *);
1485int queue_envelope_delete(uint64_t);
1486int queue_envelope_load(uint64_t, struct envelope *);
1487int queue_envelope_update(struct envelope *);
1488int queue_envelope_walk(struct envelope *);
1489int queue_message_walk(struct envelope *, uint32_t, int *, void **);
1490
1491
1492/* report_smtp.c */
1493void report_smtp_link_connect(const char *, uint64_t, const char *, int,
1494    const struct sockaddr_storage *, const struct sockaddr_storage *);
1495void report_smtp_link_disconnect(const char *, uint64_t);
1496void report_smtp_link_identify(const char *, uint64_t, const char *);
1497void report_smtp_link_tls(const char *, uint64_t, const char *);
1498void report_smtp_tx_begin(const char *, uint64_t, uint32_t);
1499void report_smtp_tx_mail(const char *, uint64_t, uint32_t, const char *, int);
1500void report_smtp_tx_rcpt(const char *, uint64_t, uint32_t, const char *, int);
1501void report_smtp_tx_envelope(const char *, uint64_t, uint32_t, uint64_t);
1502void report_smtp_tx_data(const char *, uint64_t, uint32_t, int);
1503void report_smtp_tx_commit(const char *, uint64_t, uint32_t, size_t);
1504void report_smtp_tx_rollback(const char *, uint64_t, uint32_t);
1505void report_smtp_protocol_client(const char *, uint64_t, const char *);
1506void report_smtp_protocol_server(const char *, uint64_t, const char *);
1507void report_smtp_filter_response(const char *, uint64_t, int, int, const char *);
1508void report_smtp_timeout(const char *, uint64_t);
1509
1510
1511/* ruleset.c */
1512struct rule *ruleset_match(const struct envelope *);
1513
1514
1515/* scheduler.c */
1516int scheduler(void);
1517
1518
1519/* scheduler_bakend.c */
1520struct scheduler_backend *scheduler_backend_lookup(const char *);
1521void scheduler_info(struct scheduler_info *, struct envelope *);
1522
1523
1524/* pony.c */
1525int pony(void);
1526void pony_imsg(struct mproc *, struct imsg *);
1527
1528
1529/* resolver.c */
1530void resolver_getaddrinfo(const char *, const char *, const struct addrinfo *,
1531    void(*)(void *, int, struct addrinfo*), void *);
1532void resolver_getnameinfo(const struct sockaddr *, int,
1533    void(*)(void *, int, const char *, const char *), void *);
1534void resolver_res_query(const char *, int, int,
1535    void (*cb)(void *, int, int, int, const void *, int), void *);
1536void resolver_dispatch_request(struct mproc *, struct imsg *);
1537void resolver_dispatch_result(struct mproc *, struct imsg *);
1538
1539
1540/* smtp.c */
1541void smtp_postfork(void);
1542void smtp_postprivdrop(void);
1543void smtp_imsg(struct mproc *, struct imsg *);
1544void smtp_configure(void);
1545void smtp_collect(void);
1546
1547
1548/* smtp_session.c */
1549int smtp_session(struct listener *, int, const struct sockaddr_storage *,
1550    const char *, struct io *);
1551void smtp_session_imsg(struct mproc *, struct imsg *);
1552
1553
1554/* smtpf_session.c */
1555int smtpf_session(struct listener *, int, const struct sockaddr_storage *,
1556    const char *);
1557void smtpf_session_imsg(struct mproc *, struct imsg *);
1558
1559
1560/* smtpd.c */
1561void imsg_dispatch(struct mproc *, struct imsg *);
1562const char *proc_name(enum smtp_proc_type);
1563const char *proc_title(enum smtp_proc_type);
1564const char *imsg_to_str(int);
1565void log_imsg(int, int, struct imsg *);
1566int fork_proc_backend(const char *, const char *, const char *);
1567
1568
1569/* ssl_smtpd.c */
1570void   *ssl_mta_init(void *, char *, off_t, const char *);
1571void   *ssl_smtp_init(void *, int);
1572
1573
1574/* stat_backend.c */
1575struct stat_backend	*stat_backend_lookup(const char *);
1576void	stat_increment(const char *, size_t);
1577void	stat_decrement(const char *, size_t);
1578void	stat_set(const char *, const struct stat_value *);
1579struct stat_value *stat_counter(size_t);
1580struct stat_value *stat_timestamp(time_t);
1581struct stat_value *stat_timeval(struct timeval *);
1582struct stat_value *stat_timespec(struct timespec *);
1583
1584
1585/* table.c */
1586struct table *table_find(struct smtpd *, const char *);
1587struct table *table_create(struct smtpd *, const char *, const char *,
1588    const char *);
1589int	table_config(struct table *);
1590int	table_open(struct table *);
1591int	table_update(struct table *);
1592void	table_close(struct table *);
1593void	table_dump(struct table *);
1594int	table_check_use(struct table *, uint32_t, uint32_t);
1595int	table_check_type(struct table *, uint32_t);
1596int	table_check_service(struct table *, uint32_t);
1597int	table_match(struct table *, enum table_service, const char *);
1598int	table_lookup(struct table *, enum table_service, const char *,
1599    union lookup *);
1600int	table_fetch(struct table *, enum table_service, union lookup *);
1601void table_destroy(struct smtpd *, struct table *);
1602void table_add(struct table *, const char *, const char *);
1603int table_domain_match(const char *, const char *);
1604int table_netaddr_match(const char *, const char *);
1605int table_mailaddr_match(const char *, const char *);
1606int table_regex_match(const char *, const char *);
1607void	table_open_all(struct smtpd *);
1608void	table_dump_all(struct smtpd *);
1609void	table_close_all(struct smtpd *);
1610
1611
1612/* to.c */
1613int email_to_mailaddr(struct mailaddr *, char *);
1614int text_to_netaddr(struct netaddr *, const char *);
1615int text_to_mailaddr(struct mailaddr *, const char *);
1616int text_to_relayhost(struct relayhost *, const char *);
1617int text_to_userinfo(struct userinfo *, const char *);
1618int text_to_credentials(struct credentials *, const char *);
1619int text_to_expandnode(struct expandnode *, const char *);
1620uint64_t text_to_evpid(const char *);
1621uint32_t text_to_msgid(const char *);
1622const char *sa_to_text(const struct sockaddr *);
1623const char *ss_to_text(const struct sockaddr_storage *);
1624const char *time_to_text(time_t);
1625const char *duration_to_text(time_t);
1626const char *rule_to_text(struct rule *);
1627const char *sockaddr_to_text(struct sockaddr *);
1628const char *mailaddr_to_text(const struct mailaddr *);
1629const char *expandnode_to_text(struct expandnode *);
1630
1631
1632/* util.c */
1633typedef struct arglist arglist;
1634struct arglist {
1635	char	**list;
1636	uint	  num;
1637	uint	  nalloc;
1638};
1639void addargs(arglist *, char *, ...)
1640	__attribute__((format(printf, 2, 3)));
1641int bsnprintf(char *, size_t, const char *, ...)
1642	__attribute__((format (printf, 3, 4)));
1643int mkdirs(char *, mode_t);
1644int safe_fclose(FILE *);
1645int hostname_match(const char *, const char *);
1646int mailaddr_match(const struct mailaddr *, const struct mailaddr *);
1647int valid_localpart(const char *);
1648int valid_domainpart(const char *);
1649int valid_smtp_response(const char *);
1650int secure_file(int, char *, char *, uid_t, int);
1651int  lowercase(char *, const char *, size_t);
1652void xlowercase(char *, const char *, size_t);
1653int  uppercase(char *, const char *, size_t);
1654uint64_t generate_uid(void);
1655int availdesc(void);
1656int ckdir(const char *, mode_t, uid_t, gid_t, int);
1657int rmtree(char *, int);
1658int mvpurge(char *, char *);
1659int mktmpfile(void);
1660const char *parse_smtp_response(char *, size_t, char **, int *);
1661int xasprintf(char **, const char *, ...);
1662void *xmalloc(size_t);
1663void *xcalloc(size_t, size_t);
1664char *xstrdup(const char *);
1665void *xmemdup(const void *, size_t);
1666char *strip(char *);
1667int io_xprint(struct io *, const char *);
1668int io_xprintf(struct io *, const char *, ...);
1669void log_envelope(const struct envelope *, const char *, const char *,
1670    const char *);
1671int session_socket_error(int);
1672int getmailname(char *, size_t);
1673int base64_encode(unsigned char const *, size_t, char *, size_t);
1674int base64_decode(char const *, unsigned char *, size_t);
1675
1676void log_trace_verbose(int);
1677void log_trace(int, const char *, ...)
1678    __attribute__((format (printf, 2, 3)));
1679
1680/* waitq.c */
1681int  waitq_wait(void *, void (*)(void *, void *, void *), void *);
1682void waitq_run(void *, void *);
1683
1684
1685/* runq.c */
1686struct runq;
1687
1688int runq_init(struct runq **, void (*)(struct runq *, void *));
1689int runq_schedule(struct runq *, time_t, void (*)(struct runq *, void *), void *);
1690int runq_delay(struct runq *, unsigned int, void (*)(struct runq *, void *), void *);
1691int runq_cancel(struct runq *, void (*)(struct runq *, void *), void *);
1692int runq_pending(struct runq *, void (*)(struct runq *, void *), void *, time_t *);
1693int runq_next(struct runq *, void (**)(struct runq *, void *), void **, time_t *);
1694