smtpd.h revision 1.438
1/*	$OpenBSD: smtpd.h,v 1.438 2013/11/30 10:11:57 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 "smtpd-defines.h"
26#include "smtpd-api.h"
27#include "ioev.h"
28#include "iobuf.h"
29
30#define CONF_FILE		 "/etc/mail/smtpd.conf"
31#define MAILNAME_FILE		 "/etc/mail/mailname"
32#define CA_FILE			 "/etc/ssl/cert.pem"
33
34#define PROC_COUNT		 10
35
36#define MAX_HOPS_COUNT		 100
37#define	DEFAULT_MAX_BODY_SIZE	(35*1024*1024)
38#define MAX_TAG_SIZE		 32
39#define	MAX_FILTER_NAME		 32
40
41#define	EXPAND_BUFFER		 1024
42
43#define SMTPD_QUEUE_EXPIRY	 (4 * 24 * 60 * 60)
44#define SMTPD_USER		 "_smtpd"
45#define SMTPD_QUEUE_USER	 "_smtpq"
46#define SMTPD_SOCKET		 "/var/run/smtpd.sock"
47#ifndef SMTPD_NAME
48#define	SMTPD_NAME		 "OpenSMTPD"
49#endif
50#define	SMTPD_VERSION		 "5.4"
51#define SMTPD_BANNER		 "220 %s ESMTP %s"
52#define SMTPD_SESSION_TIMEOUT	 300
53#define SMTPD_BACKLOG		 5
54
55#define	PATH_SMTPCTL		"/usr/sbin/smtpctl"
56
57#define PATH_CHROOT             "/var/empty"
58#define PATH_SPOOL		"/var/spool/smtpd"
59#define PATH_OFFLINE		"/offline"
60#define PATH_PURGE		"/purge"
61#define PATH_TEMPORARY		"/temporary"
62
63#define	PATH_FILTERS		"/usr/libexec/smtpd"
64#define	PATH_TABLES		"/usr/libexec/smtpd"
65
66#define F_STARTTLS		0x01
67#define F_SMTPS			0x02
68#define	F_TLS_OPTIONAL		0x04
69#define F_SSL		       (F_STARTTLS | F_SMTPS)
70#define F_AUTH			0x08
71#define	F_BACKUP		0x10	/* XXX - MUST BE SYNC-ED WITH RELAY_BACKUP */
72#define	F_STARTTLS_REQUIRE	0x20
73#define	F_AUTH_REQUIRE		0x40
74#define	F_LMTP			0x80
75#define	F_MASK_SOURCE		0x100
76#define	F_TLS_VERIFY		0x200
77
78/* must match F_* for mta */
79#define RELAY_STARTTLS		0x01
80#define RELAY_SMTPS		0x02
81#define	RELAY_TLS_OPTIONAL     	0x04
82#define RELAY_SSL		(RELAY_STARTTLS | RELAY_SMTPS)
83#define RELAY_AUTH		0x08
84#define RELAY_BACKUP		0x10	/* XXX - MUST BE SYNC-ED WITH F_BACKUP */
85#define RELAY_MX		0x20
86#define RELAY_LMTP		0x80
87#define	RELAY_TLS_VERIFY	0x200
88
89struct userinfo {
90	char username[SMTPD_MAXLOGNAME];
91	char directory[SMTPD_MAXPATHLEN];
92	uid_t uid;
93	gid_t gid;
94};
95
96struct netaddr {
97	struct sockaddr_storage ss;
98	int bits;
99};
100
101struct relayhost {
102	uint16_t flags;
103	char hostname[SMTPD_MAXHOSTNAMELEN];
104	uint16_t port;
105	char cert[SMTPD_MAXPATHLEN];
106	char authtable[SMTPD_MAXPATHLEN];
107	char authlabel[SMTPD_MAXPATHLEN];
108	char sourcetable[SMTPD_MAXPATHLEN];
109	char heloname[SMTPD_MAXHOSTNAMELEN];
110	char helotable[SMTPD_MAXPATHLEN];
111};
112
113struct credentials {
114	char username[SMTPD_MAXLINESIZE];
115	char password[SMTPD_MAXLINESIZE];
116};
117
118struct destination {
119	char	name[SMTPD_MAXHOSTNAMELEN];
120};
121
122struct source {
123	struct sockaddr_storage	addr;
124};
125
126struct addrname {
127	struct sockaddr_storage	addr;
128	char			name[SMTPD_MAXHOSTNAMELEN];
129};
130
131union lookup {
132	struct expand		*expand;
133	struct credentials	 creds;
134	struct netaddr		 netaddr;
135	struct source		 source;
136	struct destination	 domain;
137	struct userinfo		 userinfo;
138	struct mailaddr		 mailaddr;
139	struct addrname		 addrname;
140};
141
142/*
143 * Bump IMSG_VERSION whenever a change is made to enum imsg_type.
144 * This will ensure that we can never use a wrong version of smtpctl with smtpd.
145 */
146#define	IMSG_VERSION		7
147
148enum imsg_type {
149	IMSG_NONE,
150	IMSG_CTL_OK,		/* answer to smtpctl requests */
151	IMSG_CTL_FAIL,
152	IMSG_CTL_SHUTDOWN,
153	IMSG_CTL_VERBOSE,
154	IMSG_CTL_PAUSE_EVP,
155	IMSG_CTL_PAUSE_MDA,
156	IMSG_CTL_PAUSE_MTA,
157	IMSG_CTL_PAUSE_SMTP,
158	IMSG_CTL_RESUME_EVP,
159	IMSG_CTL_RESUME_MDA,
160	IMSG_CTL_RESUME_MTA,
161	IMSG_CTL_RESUME_SMTP,
162	IMSG_CTL_RESUME_ROUTE,
163	IMSG_CTL_LIST_MESSAGES,
164	IMSG_CTL_LIST_ENVELOPES,
165	IMSG_CTL_REMOVE,
166	IMSG_CTL_SCHEDULE,
167
168	IMSG_CTL_TRACE,
169	IMSG_CTL_UNTRACE,
170	IMSG_CTL_PROFILE,
171	IMSG_CTL_UNPROFILE,
172
173	IMSG_CTL_MTA_SHOW_HOSTS,
174	IMSG_CTL_MTA_SHOW_RELAYS,
175	IMSG_CTL_MTA_SHOW_ROUTES,
176	IMSG_CTL_MTA_SHOW_HOSTSTATS,
177
178	IMSG_CONF_START,
179	IMSG_CONF_SSL,
180	IMSG_CONF_LISTENER,
181	IMSG_CONF_TABLE,
182	IMSG_CONF_TABLE_CONTENT,
183	IMSG_CONF_RULE,
184	IMSG_CONF_RULE_SOURCE,
185	IMSG_CONF_RULE_SENDER,
186	IMSG_CONF_RULE_DESTINATION,
187	IMSG_CONF_RULE_RECIPIENT,
188	IMSG_CONF_RULE_MAPPING,
189	IMSG_CONF_RULE_USERS,
190	IMSG_CONF_FILTER,
191	IMSG_CONF_END,
192
193	IMSG_LKA_UPDATE_TABLE,
194	IMSG_LKA_EXPAND_RCPT,
195	IMSG_LKA_SECRET,
196	IMSG_LKA_SOURCE,
197	IMSG_LKA_HELO,
198	IMSG_LKA_USERINFO,
199	IMSG_LKA_AUTHENTICATE,
200	IMSG_LKA_SSL_INIT,
201	IMSG_LKA_SSL_VERIFY_CERT,
202	IMSG_LKA_SSL_VERIFY_CHAIN,
203	IMSG_LKA_SSL_VERIFY,
204
205	IMSG_DELIVERY_OK,
206	IMSG_DELIVERY_TEMPFAIL,
207	IMSG_DELIVERY_PERMFAIL,
208	IMSG_DELIVERY_LOOP,
209	IMSG_DELIVERY_HOLD,
210	IMSG_DELIVERY_RELEASE,
211
212	IMSG_BOUNCE_INJECT,
213
214	IMSG_MDA_DELIVER,
215	IMSG_MDA_DONE,
216
217	IMSG_MFA_REQ_CONNECT,
218	IMSG_MFA_REQ_HELO,
219	IMSG_MFA_REQ_MAIL,
220	IMSG_MFA_REQ_RCPT,
221	IMSG_MFA_REQ_DATA,
222	IMSG_MFA_REQ_EOM,
223	IMSG_MFA_EVENT_RSET,
224	IMSG_MFA_EVENT_COMMIT,
225	IMSG_MFA_EVENT_ROLLBACK,
226	IMSG_MFA_EVENT_DISCONNECT,
227	IMSG_MFA_SMTP_RESPONSE,
228
229	IMSG_MTA_TRANSFER,
230	IMSG_MTA_SCHEDULE,
231
232	IMSG_QUEUE_CREATE_MESSAGE,
233	IMSG_QUEUE_SUBMIT_ENVELOPE,
234	IMSG_QUEUE_COMMIT_ENVELOPES,
235	IMSG_QUEUE_REMOVE_MESSAGE,
236	IMSG_QUEUE_COMMIT_MESSAGE,
237	IMSG_QUEUE_MESSAGE_FD,
238	IMSG_QUEUE_MESSAGE_FILE,
239	IMSG_QUEUE_REMOVE,
240	IMSG_QUEUE_EXPIRE,
241	IMSG_QUEUE_BOUNCE,
242
243	IMSG_PARENT_FORWARD_OPEN,
244	IMSG_PARENT_FORK_MDA,
245	IMSG_PARENT_KILL_MDA,
246
247	IMSG_SMTP_ENQUEUE_FD,
248
249	IMSG_DNS_HOST,
250	IMSG_DNS_HOST_END,
251	IMSG_DNS_PTR,
252	IMSG_DNS_MX,
253	IMSG_DNS_MX_PREFERENCE,
254
255	IMSG_STAT_INCREMENT,
256	IMSG_STAT_DECREMENT,
257	IMSG_STAT_SET,
258
259	IMSG_DIGEST,
260	IMSG_STATS,
261	IMSG_STATS_GET,
262};
263
264enum blockmodes {
265	BM_NORMAL,
266	BM_NONBLOCK
267};
268
269enum smtp_proc_type {
270	PROC_PARENT = 0,
271	PROC_SMTP,
272	PROC_MFA,
273	PROC_LKA,
274	PROC_QUEUE,
275	PROC_MDA,
276	PROC_MTA,
277	PROC_CONTROL,
278	PROC_SCHEDULER,
279
280	PROC_FILTER,
281	PROC_CLIENT,
282};
283
284enum table_type {
285	T_NONE		= 0,
286	T_DYNAMIC	= 0x01,	/* table with external source	*/
287	T_LIST		= 0x02,	/* table holding a list		*/
288	T_HASH		= 0x04,	/* table holding a hash table	*/
289};
290
291struct table {
292	char				 t_name[SMTPD_MAXLINESIZE];
293	enum table_type			 t_type;
294	char				 t_config[SMTPD_MAXPATHLEN];
295
296	struct dict			 t_dict;
297
298	void				*t_handle;
299	struct table_backend		*t_backend;
300	void				*t_iter;
301};
302
303struct table_backend {
304	const unsigned int	services;
305	int	(*config)(struct table *);
306	void   *(*open)(struct table *);
307	int	(*update)(struct table *);
308	void	(*close)(void *);
309	int	(*lookup)(void *, const char *, enum table_service, union lookup *);
310	int	(*fetch)(void *, enum table_service, union lookup *);
311};
312
313
314enum dest_type {
315	DEST_DOM,
316	DEST_VDOM
317};
318
319enum action_type {
320	A_NONE,
321	A_RELAY,
322	A_RELAYVIA,
323	A_MAILDIR,
324	A_MBOX,
325	A_FILENAME,
326	A_MDA,
327	A_LMTP
328};
329
330enum decision {
331	R_REJECT,
332	R_ACCEPT
333};
334
335struct rule {
336	TAILQ_ENTRY(rule)		r_entry;
337	enum decision			r_decision;
338	uint8_t				r_nottag;
339	char				r_tag[MAX_TAG_SIZE];
340
341	uint8_t				r_notsources;
342	struct table		       *r_sources;
343
344	uint8_t				r_notsenders;
345	struct table		       *r_senders;
346
347	uint8_t				r_notrecipients;
348	struct table		       *r_recipients;
349
350	uint8_t				r_notdestination;
351	enum dest_type			r_desttype;
352	struct table		       *r_destination;
353
354	enum action_type		r_action;
355	union rule_dest {
356		char			buffer[EXPAND_BUFFER];
357		struct relayhost	relayhost;
358	}				r_value;
359
360	struct mailaddr		       *r_as;
361	struct table		       *r_mapping;
362	struct table		       *r_userbase;
363	time_t				r_qexpire;
364	uint8_t				r_forwardonly;
365};
366
367struct delivery_mda {
368	enum action_type	method;
369	char			usertable[SMTPD_MAXPATHLEN];
370	char			username[SMTPD_MAXLOGNAME];
371	char			buffer[EXPAND_BUFFER];
372};
373
374struct delivery_mta {
375	struct relayhost	relay;
376};
377
378enum bounce_type {
379	B_ERROR,
380	B_WARNING,
381};
382
383struct delivery_bounce {
384	enum bounce_type	type;
385	time_t			delay;
386	time_t			expire;
387};
388
389enum expand_type {
390	EXPAND_INVALID,
391	EXPAND_USERNAME,
392	EXPAND_FILENAME,
393	EXPAND_FILTER,
394	EXPAND_INCLUDE,
395	EXPAND_ADDRESS,
396	EXPAND_ERROR
397};
398
399struct expandnode {
400	RB_ENTRY(expandnode)	entry;
401	TAILQ_ENTRY(expandnode)	tq_entry;
402	enum expand_type	type;
403	int			sameuser;
404	int			alias;
405	struct rule	       *rule;
406	struct expandnode      *parent;
407	unsigned int		depth;
408	struct table   	       *mapping;
409	struct table   	       *userbase;
410	union {
411		/*
412		 * user field handles both expansion user and system user
413		 * so we MUST make it large enough to fit a mailaddr user
414		 */
415		char		user[SMTPD_MAXLOCALPARTSIZE];
416		char		buffer[EXPAND_BUFFER];
417		struct mailaddr	mailaddr;
418	}			u;
419};
420
421struct expand {
422	RB_HEAD(expandtree, expandnode)	 tree;
423	TAILQ_HEAD(xnodes, expandnode)	*queue;
424	int				 alias;
425	size_t				 nb_nodes;
426	struct rule			*rule;
427	struct expandnode		*parent;
428};
429
430#define	SMTPD_ENVELOPE_VERSION		2
431struct envelope {
432	TAILQ_ENTRY(envelope)		entry;
433
434	char				tag[MAX_TAG_SIZE];
435
436	uint32_t			version;
437	uint64_t			id;
438	enum envelope_flags		flags;
439
440	char				smtpname[SMTPD_MAXHOSTNAMELEN];
441	char				helo[SMTPD_MAXHOSTNAMELEN];
442	char				hostname[SMTPD_MAXHOSTNAMELEN];
443	char				errorline[SMTPD_MAXLINESIZE];
444	struct sockaddr_storage		ss;
445
446	struct mailaddr			sender;
447	struct mailaddr			rcpt;
448	struct mailaddr			dest;
449
450	enum delivery_type		type;
451	union {
452		struct delivery_mda	mda;
453		struct delivery_mta	mta;
454		struct delivery_bounce	bounce;
455	}				agent;
456
457	uint16_t			retry;
458	time_t				creation;
459	time_t				expire;
460	time_t				lasttry;
461	time_t				nexttry;
462	time_t				lastbounce;
463};
464
465struct listener {
466	uint16_t       		 flags;
467	int			 fd;
468	struct sockaddr_storage	 ss;
469	in_port_t		 port;
470	struct timeval		 timeout;
471	struct event		 ev;
472	char			 ssl_cert_name[SMTPD_MAXPATHLEN];
473	struct ssl		*ssl;
474	void			*ssl_ctx;
475	char			 tag[MAX_TAG_SIZE];
476	char			 authtable[SMTPD_MAXLINESIZE];
477	char			 hostname[SMTPD_MAXHOSTNAMELEN];
478	char			 hostnametable[SMTPD_MAXPATHLEN];
479	TAILQ_ENTRY(listener)	 entry;
480};
481
482struct smtpd {
483	char				sc_conffile[SMTPD_MAXPATHLEN];
484	size_t				sc_maxsize;
485
486#define SMTPD_OPT_VERBOSE		0x00000001
487#define SMTPD_OPT_NOACTION		0x00000002
488	uint32_t			sc_opts;
489
490#define SMTPD_CONFIGURING		0x00000001
491#define SMTPD_EXITING			0x00000002
492#define SMTPD_MDA_PAUSED		0x00000004
493#define SMTPD_MTA_PAUSED		0x00000008
494#define SMTPD_SMTP_PAUSED		0x00000010
495#define SMTPD_MDA_BUSY			0x00000020
496#define SMTPD_MTA_BUSY			0x00000040
497#define SMTPD_BOUNCE_BUSY		0x00000080
498#define SMTPD_SMTP_DISABLED		0x00000100
499	uint32_t			sc_flags;
500
501#define QUEUE_COMPRESSION      		0x00000001
502#define QUEUE_ENCRYPTION      		0x00000002
503#define QUEUE_EVPCACHE			0x00000004
504	uint32_t			sc_queue_flags;
505	char			       *sc_queue_key;
506	size_t				sc_queue_evpcache_size;
507
508	size_t				sc_mda_max_session;
509	size_t				sc_mda_max_user_session;
510	size_t				sc_mda_task_hiwat;
511	size_t				sc_mda_task_lowat;
512	size_t				sc_mda_task_release;
513
514	size_t				sc_mta_max_deferred;
515
516	size_t				sc_scheduler_max_inflight;
517	size_t				sc_scheduler_max_evp_batch_size;
518	size_t				sc_scheduler_max_msg_batch_size;
519	size_t				sc_scheduler_max_schedule;
520
521	int				sc_qexpire;
522#define MAX_BOUNCE_WARN			4
523	time_t				sc_bounce_warn[MAX_BOUNCE_WARN];
524	char				sc_hostname[SMTPD_MAXHOSTNAMELEN];
525	struct stat_backend	       *sc_stat;
526	struct compress_backend	       *sc_comp;
527
528	time_t					 sc_uptime;
529
530	TAILQ_HEAD(listenerlist, listener)	*sc_listeners;
531
532	TAILQ_HEAD(rulelist, rule)		*sc_rules, *sc_rules_reload;
533
534	struct dict			       *sc_ssl_dict;
535
536	struct dict			       *sc_tables_dict;		/* keyed lookup	*/
537
538	struct dict			       *sc_limits_dict;
539
540	struct dict				sc_filters;
541	uint32_t				filtermask;
542};
543
544#define	TRACE_DEBUG	0x0001
545#define	TRACE_IMSG	0x0002
546#define	TRACE_IO	0x0004
547#define	TRACE_SMTP	0x0008
548#define	TRACE_MFA	0x0010
549#define	TRACE_MTA	0x0020
550#define	TRACE_BOUNCE	0x0040
551#define	TRACE_SCHEDULER	0x0080
552#define	TRACE_LOOKUP	0x0100
553#define	TRACE_STAT	0x0200
554#define	TRACE_RULES	0x0400
555#define	TRACE_MPROC	0x0800
556#define	TRACE_EXPAND	0x1000
557#define	TRACE_TABLES	0x2000
558#define	TRACE_QUEUE	0x4000
559
560#define PROFILE_TOSTAT	0x0001
561#define PROFILE_IMSG	0x0002
562#define PROFILE_QUEUE	0x0004
563
564struct forward_req {
565	uint64_t			id;
566	uint8_t				status;
567
568	char				user[SMTPD_MAXLOGNAME];
569	uid_t				uid;
570	gid_t				gid;
571	char				directory[SMTPD_MAXPATHLEN];
572};
573
574struct deliver {
575	char			to[SMTPD_MAXPATHLEN];
576	char			from[SMTPD_MAXPATHLEN];
577	char			user[SMTPD_MAXLOGNAME];
578	short			mode;
579
580	struct userinfo		userinfo;
581};
582
583#define MAX_FILTER_PER_CHAIN	16
584struct filter {
585	int			chain;
586	int			done;
587	char			name[MAX_FILTER_NAME];
588	char			path[SMTPD_MAXPATHLEN];
589	char			filters[MAX_FILTER_NAME][MAX_FILTER_PER_CHAIN];
590};
591
592struct mta_host {
593	SPLAY_ENTRY(mta_host)	 entry;
594	struct sockaddr		*sa;
595	char			*ptrname;
596	int			 refcount;
597	size_t			 nconn;
598	time_t			 lastconn;
599	time_t			 lastptrquery;
600
601#define HOST_IGNORE	0x01
602	int			 flags;
603};
604
605struct mta_mx {
606	TAILQ_ENTRY(mta_mx)	 entry;
607	struct mta_host		*host;
608	int			 preference;
609};
610
611struct mta_domain {
612	SPLAY_ENTRY(mta_domain)	 entry;
613	char			*name;
614	int			 flags;
615	TAILQ_HEAD(, mta_mx)	 mxs;
616	int			 mxstatus;
617	int			 refcount;
618	size_t			 nconn;
619	time_t			 lastconn;
620	time_t			 lastmxquery;
621};
622
623struct mta_source {
624	SPLAY_ENTRY(mta_source)	 entry;
625	struct sockaddr		*sa;
626	int			 refcount;
627	size_t			 nconn;
628	time_t			 lastconn;
629};
630
631struct mta_connector {
632	struct mta_source		*source;
633	struct mta_relay		*relay;
634
635#define CONNECTOR_ERROR_FAMILY		0x0001
636#define CONNECTOR_ERROR_SOURCE		0x0002
637#define CONNECTOR_ERROR_MX		0x0004
638#define CONNECTOR_ERROR_ROUTE_NET	0x0008
639#define CONNECTOR_ERROR_ROUTE_SMTP	0x0010
640#define CONNECTOR_ERROR_ROUTE		0x0018
641#define CONNECTOR_ERROR			0x00ff
642
643#define CONNECTOR_LIMIT_HOST		0x0100
644#define CONNECTOR_LIMIT_ROUTE		0x0200
645#define CONNECTOR_LIMIT_SOURCE		0x0400
646#define CONNECTOR_LIMIT_RELAY		0x0800
647#define CONNECTOR_LIMIT_CONN		0x1000
648#define CONNECTOR_LIMIT_DOMAIN		0x2000
649#define CONNECTOR_LIMIT			0xff00
650
651#define CONNECTOR_NEW			0x10000
652#define CONNECTOR_WAIT			0x20000
653	int				 flags;
654
655	int				 refcount;
656	size_t				 nconn;
657	time_t				 lastconn;
658};
659
660struct mta_route {
661	SPLAY_ENTRY(mta_route)	 entry;
662	uint64_t		 id;
663	struct mta_source	*src;
664	struct mta_host		*dst;
665#define ROUTE_NEW		0x01
666#define ROUTE_RUNQ		0x02
667#define ROUTE_KEEPALIVE		0x04
668#define ROUTE_DISABLED		0xf0
669#define ROUTE_DISABLED_NET	0x10
670#define ROUTE_DISABLED_SMTP	0x20
671	int			 flags;
672	int			 nerror;
673	int			 penalty;
674	int			 refcount;
675	size_t			 nconn;
676	time_t			 lastconn;
677	time_t			 lastdisc;
678	time_t			 lastpenalty;
679};
680
681struct mta_limits {
682	size_t	maxconn_per_host;
683	size_t	maxconn_per_route;
684	size_t	maxconn_per_source;
685	size_t	maxconn_per_connector;
686	size_t	maxconn_per_relay;
687	size_t	maxconn_per_domain;
688
689	time_t	conndelay_host;
690	time_t	conndelay_route;
691	time_t	conndelay_source;
692	time_t	conndelay_connector;
693	time_t	conndelay_relay;
694	time_t	conndelay_domain;
695
696	time_t	discdelay_route;
697
698	size_t	max_mail_per_session;
699	time_t	sessdelay_transaction;
700	time_t	sessdelay_keepalive;
701
702	int	family;
703
704	int	task_hiwat;
705	int	task_lowat;
706	int	task_release;
707};
708
709struct mta_relay {
710	SPLAY_ENTRY(mta_relay)	 entry;
711	uint64_t		 id;
712
713	struct mta_domain	*domain;
714	struct mta_limits	*limits;
715	int			 flags;
716	char			*backupname;
717	int			 backuppref;
718	char			*sourcetable;
719	uint16_t		 port;
720	char			*cert;
721	char			*authtable;
722	char			*authlabel;
723	char			*helotable;
724	char			*heloname;
725	char			*secret;
726
727	int			 state;
728	size_t			 ntask;
729	TAILQ_HEAD(, mta_task)	 tasks;
730
731	struct tree		 connectors;
732	size_t			 sourceloop;
733	time_t			 lastsource;
734	time_t			 nextsource;
735
736	int			 fail;
737	char			*failstr;
738
739#define RELAY_WAIT_MX		0x01
740#define RELAY_WAIT_PREFERENCE	0x02
741#define RELAY_WAIT_SECRET	0x04
742#define RELAY_WAIT_LIMITS	0x08
743#define RELAY_WAIT_SOURCE	0x10
744#define RELAY_WAIT_CONNECTOR	0x20
745#define RELAY_WAITMASK		0x3f
746	int			 status;
747
748	int			 refcount;
749	size_t			 nconn;
750	size_t			 nconn_ready;
751	time_t			 lastconn;
752};
753
754struct mta_envelope {
755	TAILQ_ENTRY(mta_envelope)	 entry;
756	uint64_t			 id;
757	uint64_t			 session;
758	time_t				 creation;
759	char				*dest;
760	char				*rcpt;
761	struct mta_task			*task;
762	int				 delivery;
763};
764
765struct mta_task {
766	TAILQ_ENTRY(mta_task)		 entry;
767	struct mta_relay		*relay;
768	uint32_t			 msgid;
769	TAILQ_HEAD(, mta_envelope)	 envelopes;
770	char				*sender;
771};
772
773struct passwd;
774
775struct queue_backend {
776	int	(*init)(struct passwd *, int);
777};
778
779struct compress_backend {
780	size_t	(*compress_chunk)(void *, size_t, void *, size_t);
781	size_t	(*uncompress_chunk)(void *, size_t, void *, size_t);
782	int	(*compress_file)(FILE *, FILE *);
783	int	(*uncompress_file)(FILE *, FILE *);
784};
785
786/* auth structures */
787enum auth_type {
788	AUTH_BSD,
789	AUTH_PWD,
790};
791
792struct auth_backend {
793	int	(*authenticate)(char *, char *);
794};
795
796
797/* delivery_backend */
798struct delivery_backend {
799	int	allow_root;
800	void	(*open)(struct deliver *);
801};
802
803struct scheduler_backend {
804	int	(*init)(void);
805
806	int	(*insert)(struct scheduler_info *);
807	size_t	(*commit)(uint32_t);
808	size_t	(*rollback)(uint32_t);
809
810	int	(*update)(struct scheduler_info *);
811	int	(*delete)(uint64_t);
812	int	(*hold)(uint64_t, uint64_t);
813	int	(*release)(int, uint64_t, int);
814
815	int	(*batch)(int, struct scheduler_batch *);
816
817	size_t	(*messages)(uint32_t, uint32_t *, size_t);
818	size_t	(*envelopes)(uint64_t, struct evpstate *, size_t);
819	int	(*schedule)(uint64_t);
820	int	(*remove)(uint64_t);
821	int	(*suspend)(uint64_t);
822	int	(*resume)(uint64_t);
823};
824
825enum stat_type {
826	STAT_COUNTER,
827	STAT_TIMESTAMP,
828	STAT_TIMEVAL,
829	STAT_TIMESPEC,
830};
831
832struct stat_value {
833	enum stat_type	type;
834	union stat_v {
835		size_t		counter;
836		time_t		timestamp;
837		struct timeval	tv;
838		struct timespec	ts;
839	} u;
840};
841
842#define	STAT_KEY_SIZE	1024
843struct stat_kv {
844	void	*iter;
845	char	key[STAT_KEY_SIZE];
846	struct stat_value	val;
847};
848
849struct stat_backend {
850	void	(*init)(void);
851	void	(*close)(void);
852	void	(*increment)(const char *, size_t);
853	void	(*decrement)(const char *, size_t);
854	void	(*set)(const char *, const struct stat_value *);
855	int	(*iter)(void **, char **, struct stat_value *);
856};
857
858struct stat_digest {
859	time_t			 startup;
860	time_t			 timestamp;
861
862	size_t			 clt_connect;
863	size_t			 clt_disconnect;
864
865	size_t			 evp_enqueued;
866	size_t			 evp_dequeued;
867
868	size_t			 evp_expired;
869	size_t			 evp_removed;
870	size_t			 evp_bounce;
871
872	size_t			 dlv_ok;
873	size_t			 dlv_permfail;
874	size_t			 dlv_tempfail;
875	size_t			 dlv_loop;
876};
877
878
879struct mproc {
880	pid_t		 pid;
881	char		*name;
882	int		 proc;
883	void		(*handler)(struct mproc *, struct imsg *);
884	struct imsgbuf	 imsgbuf;
885
886	char		*m_buf;
887	size_t		 m_alloc;
888	size_t		 m_pos;
889	uint32_t	 m_type;
890	uint32_t	 m_peerid;
891	pid_t		 m_pid;
892	int		 m_fd;
893
894	int		 enable;
895	short		 events;
896	struct event	 ev;
897	void		*data;
898
899	off_t		 msg_in;
900	off_t		 msg_out;
901	off_t		 bytes_in;
902	off_t		 bytes_out;
903	size_t		 bytes_queued;
904	size_t		 bytes_queued_max;
905};
906
907struct msg {
908	const uint8_t	*pos;
909	const uint8_t	*end;
910};
911
912extern enum smtp_proc_type	smtpd_process;
913
914extern int verbose;
915extern int profiling;
916
917extern struct mproc *p_control;
918extern struct mproc *p_parent;
919extern struct mproc *p_lka;
920extern struct mproc *p_mda;
921extern struct mproc *p_mfa;
922extern struct mproc *p_mta;
923extern struct mproc *p_queue;
924extern struct mproc *p_scheduler;
925extern struct mproc *p_smtp;
926
927extern struct smtpd	*env;
928extern void (*imsg_callback)(struct mproc *, struct imsg *);
929
930struct imsgproc {
931	pid_t			pid;
932	struct event		ev;
933	struct imsgbuf	       *ibuf;
934	char		       *path;
935	char		       *name;
936	void		      (*cb)(struct imsg *, void *);
937	void		       *cb_arg;
938};
939
940/* inter-process structures */
941
942struct bounce_req_msg {
943	uint64_t		evpid;
944	time_t			timestamp;
945	struct delivery_bounce	bounce;
946};
947
948enum mfa_resp_status {
949	MFA_OK,
950	MFA_FAIL,
951	MFA_CLOSE,
952};
953
954enum dns_error {
955	DNS_OK = 0,
956	DNS_RETRY,
957	DNS_EINVAL,
958	DNS_ENONAME,
959	DNS_ENOTFOUND,
960};
961
962enum lka_resp_status {
963	LKA_OK,
964	LKA_TEMPFAIL,
965	LKA_PERMFAIL
966};
967
968enum ca_resp_status {
969	CA_OK,
970	CA_FAIL
971};
972
973struct ca_cert_req_msg {
974	uint64_t		reqid;
975	char			name[SMTPD_MAXPATHLEN];
976};
977
978struct ca_cert_resp_msg {
979	uint64_t		reqid;
980	enum ca_resp_status	status;
981	char		       *cert;
982	off_t			cert_len;
983	char		       *key;
984	off_t			key_len;
985};
986
987struct ca_vrfy_req_msg {
988	uint64_t		reqid;
989	char			pkiname[SMTPD_MAXHOSTNAMELEN];
990	unsigned char  	       *cert;
991	off_t			cert_len;
992	size_t			n_chain;
993	size_t			chain_offset;
994	unsigned char	      **chain_cert;
995	off_t		       *chain_cert_len;
996};
997
998struct ca_vrfy_resp_msg {
999	uint64_t		reqid;
1000	enum ca_resp_status	status;
1001};
1002
1003
1004/* aliases.c */
1005int aliases_get(struct expand *, const char *);
1006int aliases_virtual_check(struct table *, const struct mailaddr *);
1007int aliases_virtual_get(struct expand *, const struct mailaddr *);
1008int alias_parse(struct expandnode *, const char *);
1009
1010
1011/* auth.c */
1012struct auth_backend *auth_backend_lookup(enum auth_type);
1013
1014
1015/* bounce.c */
1016void bounce_add(uint64_t);
1017void bounce_fd(int);
1018
1019
1020/* ca.c */
1021int	ca_X509_verify(void *, void *, const char *, const char *, const char **);
1022
1023
1024/* compress_backend.c */
1025struct compress_backend *compress_backend_lookup(const char *);
1026size_t	compress_chunk(void *, size_t, void *, size_t);
1027size_t	uncompress_chunk(void *, size_t, void *, size_t);
1028int	compress_file(FILE *, FILE *);
1029int	uncompress_file(FILE *, FILE *);
1030
1031/* config.c */
1032#define PURGE_LISTENERS		0x01
1033#define PURGE_TABLES		0x02
1034#define PURGE_RULES		0x04
1035#define PURGE_SSL		0x08
1036#define PURGE_EVERYTHING	0xff
1037void purge_config(uint8_t);
1038void init_pipes(void);
1039void config_process(enum smtp_proc_type);
1040void config_peer(enum smtp_proc_type);
1041void config_done(void);
1042
1043
1044/* control.c */
1045pid_t control(void);
1046int control_create_socket(void);
1047
1048
1049/* crypto.c */
1050int	crypto_setup(const char *, size_t);
1051int	crypto_encrypt_file(FILE *, FILE *);
1052int	crypto_decrypt_file(FILE *, FILE *);
1053size_t	crypto_encrypt_buffer(const char *, size_t, char *, size_t);
1054size_t	crypto_decrypt_buffer(const char *, size_t, char *, size_t);
1055
1056
1057/* delivery.c */
1058struct delivery_backend *delivery_backend_lookup(enum action_type);
1059
1060
1061/* dns.c */
1062void dns_query_host(uint64_t, const char *);
1063void dns_query_ptr(uint64_t, const struct sockaddr *);
1064void dns_query_mx(uint64_t, const char *);
1065void dns_query_mx_preference(uint64_t, const char *, const char *);
1066void dns_imsg(struct mproc *, struct imsg *);
1067
1068
1069/* enqueue.c */
1070int		 enqueue(int, char **);
1071
1072
1073/* envelope.c */
1074void envelope_set_errormsg(struct envelope *, char *, ...);
1075int envelope_load_buffer(struct envelope *, const char *, size_t);
1076int envelope_dump_buffer(const struct envelope *, char *, size_t);
1077
1078
1079/* expand.c */
1080int expand_cmp(struct expandnode *, struct expandnode *);
1081void expand_insert(struct expand *, struct expandnode *);
1082struct expandnode *expand_lookup(struct expand *, struct expandnode *);
1083void expand_clear(struct expand *);
1084void expand_free(struct expand *);
1085int expand_line(struct expand *, const char *, int);
1086int expand_to_text(struct expand *, char *, size_t);
1087RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp);
1088
1089
1090/* forward.c */
1091int forwards_get(int, struct expand *);
1092
1093
1094/* imsgproc.c */
1095void imsgproc_init(void);
1096struct imsgproc *imsgproc_fork(const char *, const char *,
1097    void (*)(struct imsg *, void *), void *);
1098void imsgproc_set_read(struct imsgproc *);
1099void imsgproc_set_write(struct imsgproc *);
1100void imsgproc_set_read_write(struct imsgproc *);
1101void imsgproc_reset_callback(struct imsgproc *, void (*)(struct imsg *, void *), void *);
1102
1103/* limit.c */
1104void limit_mta_set_defaults(struct mta_limits *);
1105int limit_mta_set(struct mta_limits *, const char*, int64_t);
1106
1107/* lka.c */
1108pid_t lka(void);
1109
1110
1111/* lka_session.c */
1112void lka_session(uint64_t, struct envelope *);
1113void lka_session_forward_reply(struct forward_req *, int);
1114
1115
1116/* log.c */
1117void vlog(int, const char *, va_list);
1118
1119
1120/* mda.c */
1121pid_t mda(void);
1122
1123
1124/* mfa.c */
1125pid_t mfa(void);
1126void mfa_ready(void);
1127
1128/* mfa_session.c */
1129void mfa_filter_prepare(void);
1130void mfa_filter_init(void);
1131void mfa_filter_connect(uint64_t, const struct sockaddr *,
1132    const struct sockaddr *, const char *);
1133void mfa_filter_mailaddr(uint64_t, int, const struct mailaddr *);
1134void mfa_filter_line(uint64_t, int, const char *);
1135void mfa_filter_eom(uint64_t, int, size_t);
1136void mfa_filter(uint64_t, int);
1137void mfa_filter_event(uint64_t, int);
1138void mfa_build_fd_chain(uint64_t, int);
1139
1140/* mproc.c */
1141int mproc_fork(struct mproc *, const char*, const char *);
1142void mproc_init(struct mproc *, int);
1143void mproc_clear(struct mproc *);
1144void mproc_enable(struct mproc *);
1145void mproc_disable(struct mproc *);
1146void m_compose(struct mproc *, uint32_t, uint32_t, pid_t, int, void *, size_t);
1147void m_composev(struct mproc *, uint32_t, uint32_t, pid_t, int,
1148    const struct iovec *, int);
1149void m_forward(struct mproc *, struct imsg *);
1150void m_create(struct mproc *, uint32_t, uint32_t, pid_t, int);
1151void m_add(struct mproc *, const void *, size_t);
1152void m_add_int(struct mproc *, int);
1153void m_add_u32(struct mproc *, uint32_t);
1154void m_add_time(struct mproc *, time_t);
1155void m_add_string(struct mproc *, const char *);
1156void m_add_data(struct mproc *, const void *, size_t);
1157void m_add_evpid(struct mproc *, uint64_t);
1158void m_add_msgid(struct mproc *, uint32_t);
1159void m_add_id(struct mproc *, uint64_t);
1160void m_add_sockaddr(struct mproc *, const struct sockaddr *);
1161void m_add_mailaddr(struct mproc *, const struct mailaddr *);
1162void m_add_envelope(struct mproc *, const struct envelope *);
1163void m_close(struct mproc *);
1164
1165void m_msg(struct msg *, struct imsg *);
1166int  m_is_eom(struct msg *);
1167void m_end(struct msg *);
1168void m_get_int(struct msg *, int *);
1169void m_get_u32(struct msg *, uint32_t *);
1170void m_get_time(struct msg *, time_t *);
1171void m_get_string(struct msg *, const char **);
1172void m_get_data(struct msg *, const void **, size_t *);
1173void m_get_evpid(struct msg *, uint64_t *);
1174void m_get_msgid(struct msg *, uint32_t *);
1175void m_get_id(struct msg *, uint64_t *);
1176void m_get_sockaddr(struct msg *, struct sockaddr *);
1177void m_get_mailaddr(struct msg *, struct mailaddr *);
1178void m_get_envelope(struct msg *, struct envelope *);
1179
1180
1181/* mta.c */
1182pid_t mta(void);
1183void mta_route_ok(struct mta_relay *, struct mta_route *);
1184void mta_route_error(struct mta_relay *, struct mta_route *);
1185void mta_route_down(struct mta_relay *, struct mta_route *);
1186void mta_route_collect(struct mta_relay *, struct mta_route *);
1187void mta_source_error(struct mta_relay *, struct mta_route *, const char *);
1188void mta_delivery_log(struct mta_envelope *, const char *, const char *, int, const char *);
1189void mta_delivery_notify(struct mta_envelope *, int, const char *, uint32_t);
1190void mta_delivery(struct mta_envelope *, const char *, const char *, int, const char *, uint32_t);
1191struct mta_task *mta_route_next_task(struct mta_relay *, struct mta_route *);
1192const char *mta_host_to_text(struct mta_host *);
1193const char *mta_relay_to_text(struct mta_relay *);
1194
1195/* mta_session.c */
1196void mta_session(struct mta_relay *, struct mta_route *);
1197void mta_session_imsg(struct mproc *, struct imsg *);
1198
1199
1200/* parse.y */
1201int parse_config(struct smtpd *, const char *, int);
1202int cmdline_symset(char *);
1203
1204
1205/* queue.c */
1206pid_t queue(void);
1207void queue_ok(uint64_t);
1208void queue_tempfail(uint64_t, uint32_t, const char *);
1209void queue_permfail(uint64_t, const char *);
1210void queue_loop(uint64_t);
1211void queue_flow_control(void);
1212
1213
1214/* queue_backend.c */
1215uint32_t queue_generate_msgid(void);
1216uint64_t queue_generate_evpid(uint32_t);
1217int queue_init(const char *, int);
1218int queue_message_create(uint32_t *);
1219int queue_message_delete(uint32_t);
1220int queue_message_commit(uint32_t);
1221int queue_message_fd_r(uint32_t);
1222int queue_message_fd_rw(uint32_t);
1223int queue_message_corrupt(uint32_t);
1224int queue_envelope_create(struct envelope *);
1225int queue_envelope_delete(uint64_t);
1226int queue_envelope_load(uint64_t, struct envelope *);
1227int queue_envelope_update(struct envelope *);
1228int queue_envelope_walk(struct envelope *);
1229
1230
1231/* ruleset.c */
1232struct rule *ruleset_match(const struct envelope *);
1233
1234
1235/* scheduler.c */
1236pid_t scheduler(void);
1237
1238
1239/* scheduler_bakend.c */
1240struct scheduler_backend *scheduler_backend_lookup(const char *);
1241void scheduler_info(struct scheduler_info *, struct envelope *, uint32_t);
1242time_t scheduler_compute_schedule(struct scheduler_info *);
1243
1244
1245/* smtp.c */
1246pid_t smtp(void);
1247void smtp_collect(void);
1248
1249
1250/* smtp_session.c */
1251int smtp_session(struct listener *, int, const struct sockaddr_storage *,
1252    const char *);
1253void smtp_session_imsg(struct mproc *, struct imsg *);
1254
1255
1256/* smtpd.c */
1257void imsg_dispatch(struct mproc *, struct imsg *);
1258void post_fork(int);
1259const char *proc_name(enum smtp_proc_type);
1260const char *proc_title(enum smtp_proc_type);
1261const char *imsg_to_str(int);
1262
1263
1264/* ssl_smtpd.c */
1265void   *ssl_mta_init(char *, off_t, char *, off_t);
1266void   *ssl_smtp_init(void *, char *, off_t, char *, off_t);
1267
1268
1269/* stat_backend.c */
1270struct stat_backend	*stat_backend_lookup(const char *);
1271void	stat_increment(const char *, size_t);
1272void	stat_decrement(const char *, size_t);
1273void	stat_set(const char *, const struct stat_value *);
1274struct stat_value *stat_counter(size_t);
1275struct stat_value *stat_timestamp(time_t);
1276struct stat_value *stat_timeval(struct timeval *);
1277struct stat_value *stat_timespec(struct timespec *);
1278
1279
1280/* table.c */
1281struct table *table_find(const char *, const char *);
1282struct table *table_create(const char *, const char *, const char *,
1283    const char *);
1284int	table_config(struct table *);
1285int	table_open(struct table *);
1286int	table_update(struct table *);
1287void	table_close(struct table *);
1288int	table_check_use(struct table *, uint32_t, uint32_t);
1289int	table_check_type(struct table *, uint32_t);
1290int	table_check_service(struct table *, uint32_t);
1291int	table_lookup(struct table *, const char *, enum table_service,
1292    union lookup *);
1293int	table_fetch(struct table *, enum table_service, union lookup *);
1294void table_destroy(struct table *);
1295void table_add(struct table *, const char *, const char *);
1296void table_delete(struct table *, const char *);
1297int table_domain_match(const char *, const char *);
1298int table_netaddr_match(const char *, const char *);
1299int table_mailaddr_match(const char *, const char *);
1300void	table_open_all(void);
1301void	table_dump_all(void);
1302void	table_close_all(void);
1303const void	*table_get(struct table *, const char *);
1304int table_parse_lookup(enum table_service, const char *, const char *,
1305    union lookup *);
1306
1307
1308/* to.c */
1309int email_to_mailaddr(struct mailaddr *, char *);
1310int text_to_netaddr(struct netaddr *, const char *);
1311int text_to_mailaddr(struct mailaddr *, const char *);
1312int text_to_relayhost(struct relayhost *, const char *);
1313int text_to_userinfo(struct userinfo *, const char *);
1314int text_to_credentials(struct credentials *, const char *);
1315int text_to_expandnode(struct expandnode *, const char *);
1316uint64_t text_to_evpid(const char *);
1317uint32_t text_to_msgid(const char *);
1318const char *sa_to_text(const struct sockaddr *);
1319const char *ss_to_text(const struct sockaddr_storage *);
1320const char *time_to_text(time_t);
1321const char *duration_to_text(time_t);
1322const char *relayhost_to_text(const struct relayhost *);
1323const char *rule_to_text(struct rule *);
1324const char *sockaddr_to_text(struct sockaddr *);
1325const char *mailaddr_to_text(const struct mailaddr *);
1326const char *expandnode_to_text(struct expandnode *);
1327
1328/* util.c */
1329typedef struct arglist arglist;
1330struct arglist {
1331	char	**list;
1332	uint	  num;
1333	uint	  nalloc;
1334};
1335void addargs(arglist *, char *, ...)
1336	__attribute__((format(printf, 2, 3)));
1337int bsnprintf(char *, size_t, const char *, ...)
1338	__attribute__((format (printf, 3, 4)));
1339int mkdirs(char *, mode_t);
1340int safe_fclose(FILE *);
1341int hostname_match(const char *, const char *);
1342int valid_localpart(const char *);
1343int valid_domainpart(const char *);
1344int secure_file(int, char *, char *, uid_t, int);
1345int  lowercase(char *, const char *, size_t);
1346void xlowercase(char *, const char *, size_t);
1347int  uppercase(char *, const char *, size_t);
1348uint64_t generate_uid(void);
1349void fdlimit(double);
1350int availdesc(void);
1351int ckdir(const char *, mode_t, uid_t, gid_t, int);
1352int rmtree(char *, int);
1353int mvpurge(char *, char *);
1354int mktmpfile(void);
1355const char *parse_smtp_response(char *, size_t, char **, int *);
1356void *xmalloc(size_t, const char *);
1357void *xcalloc(size_t, size_t, const char *);
1358char *xstrdup(const char *, const char *);
1359void *xmemdup(const void *, size_t, const char *);
1360char *strip(char *);
1361void iobuf_xinit(struct iobuf *, size_t, size_t, const char *);
1362void iobuf_xfqueue(struct iobuf *, const char *, const char *, ...);
1363void log_envelope(const struct envelope *, const char *, const char *,
1364    const char *);
1365void session_socket_blockmode(int, enum blockmodes);
1366void session_socket_no_linger(int);
1367int session_socket_error(int);
1368int getmailname(char *, size_t);
1369
1370
1371/* waitq.c */
1372int  waitq_wait(void *, void (*)(void *, void *, void *), void *);
1373void waitq_run(void *, void *);
1374
1375/* runq.c */
1376struct runq;
1377
1378int runq_init(struct runq **, void (*)(struct runq *, void *));
1379int runq_schedule(struct runq *, time_t, void (*)(struct runq *, void *), void *);
1380int runq_delay(struct runq *, unsigned int, void (*)(struct runq *, void *), void *);
1381int runq_cancel(struct runq *, void (*)(struct runq *, void *), void *);
1382int runq_pending(struct runq *, void (*)(struct runq *, void *), void *, time_t *);
1383int runq_next(struct runq *, void (**)(struct runq *, void *), void **, time_t *);
1384