smtpd.h revision 1.214
1/*	$OpenBSD: smtpd.h,v 1.214 2011/04/15 17:01:05 gilles Exp $	*/
2
3/*
4 * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef nitems
21#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
22#endif
23
24#define IMSG_SIZE_CHECK(p) do {					\
25	if (IMSG_DATA_SIZE(&imsg) != sizeof(*p))		\
26		fatalx("bad length imsg received");		\
27} while (0)
28#define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
29
30
31
32#define CONF_FILE		 "/etc/mail/smtpd.conf"
33#define MAX_LISTEN		 16
34#define PROC_COUNT		 9
35#define MAX_NAME_SIZE		 64
36
37#define MAX_HOPS_COUNT		 100
38
39/* sizes include the tailing '\0' */
40#define MAX_LINE_SIZE		 1024
41#define MAX_LOCALPART_SIZE	 128
42#define MAX_DOMAINPART_SIZE	 MAXHOSTNAMELEN
43/*#define MAX_ID_SIZE		 64*/
44#define MAX_TAG_SIZE		 32
45
46/* return and forward path size */
47#define MAX_PATH_SIZE		 256
48#define MAX_RULEBUFFER_LEN	 256
49
50#define SMTPD_QUEUE_INTERVAL	 (15 * 60)
51#define SMTPD_QUEUE_MAXINTERVAL	 (4 * 60 * 60)
52#define SMTPD_QUEUE_EXPIRY	 (4 * 24 * 60 * 60)
53#define SMTPD_USER		 "_smtpd"
54#define SMTPD_SOCKET		 "/var/run/smtpd.sock"
55#define SMTPD_BANNER		 "220 %s ESMTP OpenSMTPD"
56#define SMTPD_SESSION_TIMEOUT	 300
57#define SMTPD_BACKLOG		 5
58
59#define	PATH_MAILLOCAL		"/usr/libexec/mail.local"
60#define	PATH_SMTPCTL		"/usr/sbin/smtpctl"
61
62#define	DIRHASH_BUCKETS		 4096
63
64#define PATH_SPOOL		"/var/spool/smtpd"
65
66#define PATH_ENQUEUE		"/enqueue"
67#define PATH_INCOMING		"/incoming"
68#define PATH_QUEUE		"/queue"
69#define PATH_PURGE		"/purge"
70
71#define PATH_MESSAGE		"/message"
72#define PATH_ENVELOPES		"/envelopes"
73
74#define PATH_OFFLINE		"/offline"
75#define PATH_BOUNCE		"/bounce"
76
77/* number of MX records to lookup */
78#define MAX_MX_COUNT		10
79
80/* max response delay under flood conditions */
81#define MAX_RESPONSE_DELAY	60
82
83/* how many responses per state are undelayed */
84#define FAST_RESPONSES		2
85
86/* max len of any smtp line */
87#define	SMTP_LINE_MAX		16384
88
89#define F_STARTTLS		 0x01
90#define F_SMTPS			 0x02
91#define F_AUTH			 0x04
92#define F_SSL			(F_SMTPS|F_STARTTLS)
93
94#define F_SCERT			0x01
95#define F_CCERT			0x02
96
97#define ADVERTISE_TLS(s) \
98	((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE))
99
100#define ADVERTISE_AUTH(s) \
101	((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \
102	 !((s)->s_flags & F_AUTHENTICATED))
103
104#define SET_IF_GREATER(x,y) do { y = MAX(x,y); } while(0)
105
106
107typedef u_int32_t	objid_t;
108
109struct netaddr {
110	struct sockaddr_storage ss;
111	int bits;
112};
113
114struct relayhost {
115	u_int8_t flags;
116	char hostname[MAXHOSTNAMELEN];
117	u_int16_t port;
118	char cert[PATH_MAX];
119	objid_t secmapid;
120};
121
122enum imsg_type {
123	IMSG_NONE,
124	IMSG_CTL_OK,		/* answer to smtpctl requests */
125	IMSG_CTL_FAIL,
126	IMSG_CTL_SHUTDOWN,
127	IMSG_CTL_VERBOSE,
128	IMSG_CONF_START,
129	IMSG_CONF_SSL,
130	IMSG_CONF_SSL_CERT,
131	IMSG_CONF_SSL_KEY,
132	IMSG_CONF_LISTENER,
133	IMSG_CONF_MAP,
134	IMSG_CONF_MAP_CONTENT,
135	IMSG_CONF_RULE,
136	IMSG_CONF_RULE_SOURCE,
137	IMSG_CONF_CONDITION,
138	IMSG_CONF_OPTION,
139	IMSG_CONF_END,
140	IMSG_CONF_RELOAD,
141	IMSG_LKA_MAIL,
142	IMSG_LKA_RCPT,
143	IMSG_LKA_SECRET,
144	IMSG_LKA_RULEMATCH,
145	IMSG_MDA_SESS_NEW,
146	IMSG_MDA_DONE,
147	IMSG_MFA_RCPT,
148	IMSG_MFA_MAIL,
149
150	IMSG_QUEUE_CREATE_MESSAGE,
151	IMSG_QUEUE_SUBMIT_ENVELOPE,
152	IMSG_QUEUE_COMMIT_ENVELOPES,
153	IMSG_QUEUE_REMOVE_MESSAGE,
154	IMSG_QUEUE_COMMIT_MESSAGE,
155	IMSG_QUEUE_TEMPFAIL,
156	IMSG_QUEUE_STATS,
157	IMSG_QUEUE_PAUSE_LOCAL,
158	IMSG_QUEUE_PAUSE_OUTGOING,
159	IMSG_QUEUE_RESUME_LOCAL,
160	IMSG_QUEUE_RESUME_OUTGOING,
161
162	IMSG_QUEUE_REMOVE_SUBMISSION,
163	IMSG_QUEUE_MESSAGE_UPDATE,
164	IMSG_QUEUE_MESSAGE_FD,
165	IMSG_QUEUE_MESSAGE_FILE,
166	IMSG_QUEUE_SCHEDULE,
167	IMSG_QUEUE_REMOVE,
168
169	IMSG_BATCH_CREATE,
170	IMSG_BATCH_APPEND,
171	IMSG_BATCH_CLOSE,
172	IMSG_BATCH_DONE,
173
174	IMSG_PARENT_ENQUEUE_OFFLINE,
175	IMSG_PARENT_FORWARD_OPEN,
176	IMSG_PARENT_FORK_MDA,
177	IMSG_PARENT_STATS,
178
179	IMSG_PARENT_AUTHENTICATE,
180	IMSG_PARENT_SEND_CONFIG,
181
182	IMSG_SMTP_STATS,
183
184	IMSG_STATS,
185	IMSG_SMTP_ENQUEUE,
186	IMSG_SMTP_PAUSE,
187	IMSG_SMTP_RESUME,
188
189	IMSG_DNS_HOST,
190	IMSG_DNS_HOST_END,
191	IMSG_DNS_MX,
192	IMSG_DNS_PTR
193};
194
195enum blockmodes {
196	BM_NORMAL,
197	BM_NONBLOCK
198};
199
200struct imsgev {
201	struct imsgbuf		 ibuf;
202	void			(*handler)(int, short, void *);
203	struct event		 ev;
204	void			*data;
205	struct smtpd		*env;
206	int			 proc;
207	short			 events;
208};
209
210struct ctl_conn {
211	TAILQ_ENTRY(ctl_conn)	 entry;
212	u_int8_t		 flags;
213#define CTL_CONN_NOTIFY		 0x01
214	struct imsgev		 iev;
215};
216TAILQ_HEAD(ctl_connlist, ctl_conn);
217
218struct ctl_id {
219	objid_t		 id;
220	char		 name[MAX_NAME_SIZE];
221};
222
223enum smtp_proc_type {
224	PROC_PARENT = 0,
225	PROC_SMTP,
226	PROC_MFA,
227	PROC_LKA,
228	PROC_QUEUE,
229	PROC_MDA,
230	PROC_MTA,
231	PROC_CONTROL,
232	PROC_RUNNER,
233} smtpd_process;
234
235struct peer {
236	enum smtp_proc_type	 id;
237	void			(*cb)(int, short, void *);
238};
239
240enum map_type {
241	T_SINGLE,
242	T_LIST,
243	T_HASH
244};
245
246enum map_src {
247	S_NONE,
248	S_DYN,
249	S_DNS,
250	S_PLAIN,
251	S_DB,
252	S_EXT
253};
254
255enum map_kind {
256	K_NONE,
257	K_ALIAS,
258	K_VIRTUAL,
259	K_SECRET
260};
261
262enum mapel_type {
263	ME_STRING,
264	ME_NET,
265	ME_NETMASK
266};
267
268struct mapel {
269	TAILQ_ENTRY(mapel)		 me_entry;
270	union mapel_data {
271		char			 med_string[MAX_LINE_SIZE];
272		struct netaddr		 med_addr;
273	}				 me_key;
274	union mapel_data		 me_val;
275};
276
277struct map {
278	TAILQ_ENTRY(map)		 m_entry;
279#define F_USED				 0x01
280#define F_DYNAMIC			 0x02
281	u_int8_t			 m_flags;
282	char				 m_name[MAX_LINE_SIZE];
283	objid_t				 m_id;
284	enum map_type			 m_type;
285	enum mapel_type			 m_eltype;
286	enum map_src			 m_src;
287	char				 m_config[MAXPATHLEN];
288	TAILQ_HEAD(mapel_list, mapel)	 m_contents;
289};
290
291struct map_backend {
292	enum map_src source;
293	void *(*open)(char *);
294	void (*close)(void *);
295	char *(*get)(void *, char *, size_t *);
296	int (*put)(void *, char *, char *);
297};
298
299struct map_parser {
300	enum map_kind kind;
301	void *(*extract)(char *, char *, size_t);
302};
303
304enum cond_type {
305	C_ALL,
306	C_NET,
307	C_DOM,
308	C_VDOM
309};
310
311struct cond {
312	TAILQ_ENTRY(cond)		 c_entry;
313	objid_t				 c_map;
314	enum cond_type			 c_type;
315};
316
317enum action_type {
318	A_INVALID,
319	A_RELAY,
320	A_RELAYVIA,
321	A_MAILDIR,
322	A_MBOX,
323	A_FILENAME,
324	A_EXT
325};
326
327#define IS_MAILBOX(x)	((x).rule.r_action == A_MAILDIR || (x).rule.r_action == A_MBOX || (x).rule.r_action == A_FILENAME)
328#define IS_RELAY(x)	((x).rule.r_action == A_RELAY || (x).rule.r_action == A_RELAYVIA)
329#define IS_EXT(x)	((x).rule.r_action == A_EXT)
330
331struct rule {
332	TAILQ_ENTRY(rule)		 r_entry;
333	char				 r_tag[MAX_TAG_SIZE];
334	int				 r_accept;
335	struct map			*r_sources;
336	struct cond			 r_condition;
337	enum action_type		 r_action;
338	union rule_dest {
339		char			 buffer[MAX_RULEBUFFER_LEN];
340		struct relayhost       	 relayhost;
341	}				 r_value;
342
343	char				*r_user;
344	objid_t				 r_amap;
345	time_t				 r_qexpire;
346};
347
348enum path_flags {
349	F_PATH_ALIAS = 0x1,
350	F_PATH_VIRTUAL = 0x2,
351	F_PATH_EXPANDED = 0x4,
352	F_PATH_NOFORWARD = 0x8,
353	F_PATH_FORWARDED = 0x10,
354	F_PATH_ACCOUNT = 0x20,
355	F_PATH_AUTHENTICATED = 0x40,
356	F_PATH_RELAY = 0x80,
357};
358
359struct mailaddr {
360	char	user[MAX_LOCALPART_SIZE];
361	char	domain[MAX_DOMAINPART_SIZE];
362};
363
364union path_data {
365	char username[MAXLOGNAME];
366	char filename[MAXPATHLEN];
367	char filter[MAXPATHLEN];
368	struct mailaddr mailaddr;
369};
370
371struct path {
372	TAILQ_ENTRY(path)		 entry;
373	struct rule			 rule;
374	enum path_flags			 flags;
375	u_int8_t			 forwardcnt;
376	char				 user[MAX_LOCALPART_SIZE];
377	char				 domain[MAX_DOMAINPART_SIZE];
378	char				 pw_name[MAXLOGNAME];
379	union path_data			 u;
380};
381TAILQ_HEAD(deliverylist, path);
382
383enum expand_type {
384	EXPAND_INVALID,
385	EXPAND_USERNAME,
386	EXPAND_FILENAME,
387	EXPAND_FILTER,
388	EXPAND_INCLUDE,
389	EXPAND_ADDRESS
390};
391
392enum expand_flags {
393	F_EXPAND_NONE,
394	F_EXPAND_DONE
395};
396
397struct expandnode {
398	RB_ENTRY(expandnode)	entry;
399	size_t			refcnt;
400	enum expand_flags      	flags;
401	enum expand_type       	type;
402	union path_data		u;
403};
404
405RB_HEAD(expandtree, expandnode);
406
407enum message_type {
408	T_MDA_MESSAGE		= 0x1,
409	T_MTA_MESSAGE		= 0x2,
410	T_BOUNCE_MESSAGE	= 0x4
411};
412
413enum message_status {
414	S_MESSAGE_PERMFAILURE	= 0x2,
415	S_MESSAGE_TEMPFAILURE	= 0x4,
416	S_MESSAGE_REJECTED	= 0x8,
417	S_MESSAGE_ACCEPTED	= 0x10,
418	S_MESSAGE_RETRY		= 0x20,
419	S_MESSAGE_EDNS		= 0x40,
420	S_MESSAGE_ECONNECT	= 0x80
421};
422
423enum message_flags {
424	F_MESSAGE_RESOLVED	= 0x1,
425	F_MESSAGE_SCHEDULED	= 0x2,
426	F_MESSAGE_PROCESSING	= 0x4,
427	F_MESSAGE_AUTHENTICATED	= 0x8,
428	F_MESSAGE_ENQUEUED	= 0x10,
429	F_MESSAGE_FORCESCHEDULE	= 0x20,
430	F_MESSAGE_BOUNCE	= 0x40
431};
432
433struct message {
434	TAILQ_ENTRY(message)		 entry;
435
436	enum message_type		 type;
437
438	u_int64_t			 id;
439	u_int64_t			 session_id;
440	u_int64_t			 batch_id;
441
442	char				 tag[MAX_TAG_SIZE];
443
444	u_int64_t			 evpid;
445//	char				 message_id[MAX_ID_SIZE];
446//	char				 message_uid[MAX_ID_SIZE];
447
448	char				 session_helo[MAXHOSTNAMELEN];
449	char				 session_hostname[MAXHOSTNAMELEN];
450	char				 session_errorline[MAX_LINE_SIZE];
451	struct sockaddr_storage		 session_ss;
452	struct path			 session_rcpt;
453
454	struct path			 sender;
455	struct path			 recipient;
456
457	time_t				 creation;
458	time_t				 lasttry;
459	time_t				 expire;
460	u_int8_t			 retry;
461	enum message_flags		 flags;
462	enum message_status		 status;
463};
464
465enum child_type {
466	CHILD_INVALID,
467	CHILD_DAEMON,
468	CHILD_MDA,
469	CHILD_ENQUEUE_OFFLINE
470};
471
472struct child {
473	SPLAY_ENTRY(child)	 entry;
474	pid_t			 pid;
475	enum child_type		 type;
476	enum smtp_proc_type	 title;
477	int			 mda_out;
478	u_int32_t		 mda_id;
479};
480
481enum session_state {
482	S_INVALID = 0,
483	S_INIT,
484	S_GREETED,
485	S_TLS,
486	S_AUTH_INIT,
487	S_AUTH_USERNAME,
488	S_AUTH_PASSWORD,
489	S_AUTH_FINALIZE,
490	S_HELO,
491	S_MAIL_MFA,
492	S_MAIL_QUEUE,
493	S_MAIL,
494	S_RCPT_MFA,
495	S_RCPT,
496	S_DATA,
497	S_DATA_QUEUE,
498	S_DATACONTENT,
499	S_DONE,
500	S_QUIT
501};
502#define STATE_COUNT	18
503
504struct ssl {
505	SPLAY_ENTRY(ssl)	 ssl_nodes;
506	char			 ssl_name[PATH_MAX];
507	char			*ssl_cert;
508	off_t			 ssl_cert_len;
509	char			*ssl_key;
510	off_t			 ssl_key_len;
511	char			*ssl_dhparams;
512	off_t			 ssl_dhparams_len;
513	u_int8_t		 flags;
514};
515
516struct listener {
517	u_int8_t		 flags;
518	int			 fd;
519	struct sockaddr_storage	 ss;
520	in_port_t		 port;
521	struct timeval		 timeout;
522	struct event		 ev;
523	struct smtpd		*env;
524	char			 ssl_cert_name[PATH_MAX];
525	struct ssl		*ssl;
526	void			*ssl_ctx;
527	char			 tag[MAX_TAG_SIZE];
528	TAILQ_ENTRY(listener)	 entry;
529};
530
531struct auth {
532	u_int64_t	 id;
533	char		 user[MAXLOGNAME];
534	char		 pass[MAX_LINE_SIZE];
535	int		 success;
536};
537
538enum session_flags {
539	F_EHLO		= 0x1,
540	F_QUIT		= 0x2,
541	F_8BITMIME	= 0x4,
542	F_SECURE	= 0x8,
543	F_AUTHENTICATED	= 0x10,
544	F_PEERHASTLS	= 0x20,
545	F_PEERHASAUTH	= 0x40,
546	F_WRITEONLY	= 0x80
547};
548
549struct session {
550	SPLAY_ENTRY(session)		 s_nodes;
551	u_int64_t			 s_id;
552
553	enum session_flags		 s_flags;
554	enum session_state		 s_state;
555	int				 s_fd;
556	struct sockaddr_storage		 s_ss;
557	char				 s_hostname[MAXHOSTNAMELEN];
558	struct event			 s_ev;
559	struct bufferevent		*s_bev;
560	struct listener			*s_l;
561	struct smtpd			*s_env;
562	void				*s_ssl;
563	u_char				*s_buf;
564	int				 s_buflen;
565	struct timeval			 s_tv;
566	struct message			 s_msg;
567	short				 s_nresp[STATE_COUNT];
568	size_t				 rcptcount;
569	long				 s_datalen;
570
571	struct auth			 s_auth;
572
573	FILE				*datafp;
574	int				 mboxfd;
575	int				 messagefd;
576};
577
578
579/* ram-queue structures */
580struct ramqueue_host {
581	RB_ENTRY(ramqueue_host)		host_entry;
582	TAILQ_HEAD(,ramqueue_batch)	batch_queue;
583	u_int64_t			h_id;
584	char				hostname[MAXHOSTNAMELEN];
585};
586struct ramqueue_batch {
587	TAILQ_ENTRY(ramqueue_batch)	batch_entry;
588	TAILQ_HEAD(,ramqueue_envelope)	envelope_queue;
589	enum message_type		type;
590	u_int64_t			h_id;
591	u_int64_t			b_id;
592	u_int32_t      			msgid;
593	struct rule			rule;
594};
595struct ramqueue_envelope {
596	TAILQ_ENTRY(ramqueue_envelope)	 queue_entry;
597	TAILQ_ENTRY(ramqueue_envelope)	 batchqueue_entry;
598	struct ramqueue_host		*host;
599	struct ramqueue_batch		*batch;
600	u_int64_t      			 evpid;
601	time_t				 sched;
602};
603
604struct ramqueue {
605	struct smtpd			       *env;
606	struct ramqueue_envelope	       *current_evp;
607	RB_HEAD(hosttree, ramqueue_host)	hosttree;
608	TAILQ_HEAD(,ramqueue_envelope)		queue;
609};
610
611
612struct smtpd {
613	char					 sc_conffile[MAXPATHLEN];
614	size_t					 sc_maxsize;
615
616#define SMTPD_OPT_VERBOSE			 0x00000001
617#define SMTPD_OPT_NOACTION			 0x00000002
618	u_int32_t				 sc_opts;
619#define SMTPD_CONFIGURING			 0x00000001
620#define SMTPD_EXITING				 0x00000002
621#define SMTPD_MDA_PAUSED		       	 0x00000004
622#define SMTPD_MTA_PAUSED		       	 0x00000008
623#define SMTPD_SMTP_PAUSED		       	 0x00000010
624	u_int32_t				 sc_flags;
625	struct timeval				 sc_qintval;
626	int					 sc_qexpire;
627	u_int32_t				 sc_maxconn;
628	struct event				 sc_ev;
629	int					 *sc_pipes[PROC_COUNT]
630							[PROC_COUNT];
631	struct imsgev				*sc_ievs[PROC_COUNT];
632	int					 sc_instances[PROC_COUNT];
633	int					 sc_instance;
634	char					*sc_title[PROC_COUNT];
635	struct passwd				*sc_pw;
636	char					 sc_hostname[MAXHOSTNAMELEN];
637	struct ramqueue				 sc_rqueue;
638	struct queue_backend			*sc_queue;
639
640	TAILQ_HEAD(listenerlist, listener)	*sc_listeners;
641	TAILQ_HEAD(maplist, map)		*sc_maps, *sc_maps_reload;
642	TAILQ_HEAD(rulelist, rule)		*sc_rules, *sc_rules_reload;
643	SPLAY_HEAD(sessiontree, session)	 sc_sessions;
644	SPLAY_HEAD(msgtree, message)		 sc_messages;
645	SPLAY_HEAD(ssltree, ssl)		*sc_ssl;
646	SPLAY_HEAD(childtree, child)		 children;
647	SPLAY_HEAD(lkatree, lkasession)		 lka_sessions;
648	SPLAY_HEAD(dnstree, dnssession)		 dns_sessions;
649	SPLAY_HEAD(mtatree, mta_session)	 mta_sessions;
650	LIST_HEAD(mdalist, mda_session)		 mda_sessions;
651
652	struct stats				*stats;
653};
654
655struct s_parent {
656	time_t		start;
657};
658
659struct s_queue {
660	size_t		inserts_local;
661	size_t		inserts_remote;
662};
663
664struct s_runner {
665	size_t		active;
666	size_t		maxactive;
667	size_t		bounces_active;
668	size_t		bounces_maxactive;
669	size_t		bounces;
670};
671
672struct s_session {
673	size_t		sessions;
674	size_t		sessions_inet4;
675	size_t		sessions_inet6;
676	size_t		sessions_active;
677	size_t		sessions_maxactive;
678
679	size_t		smtps;
680	size_t		smtps_active;
681	size_t		smtps_maxactive;
682
683	size_t		starttls;
684	size_t		starttls_active;
685	size_t		starttls_maxactive;
686
687	size_t		read_error;
688	size_t		read_timeout;
689	size_t		read_eof;
690	size_t		write_error;
691	size_t		write_timeout;
692	size_t		write_eof;
693	size_t		toofast;
694	size_t		tempfail;
695	size_t		linetoolong;
696	size_t		delays;
697};
698
699struct s_mda {
700	size_t		sessions;
701	size_t		sessions_active;
702	size_t		sessions_maxactive;
703};
704
705struct s_control {
706	size_t		sessions;
707	size_t		sessions_active;
708	size_t		sessions_maxactive;
709};
710
711struct s_lka {
712	size_t		queries;
713	size_t		queries_active;
714	size_t		queries_maxactive;
715	size_t		queries_mx;
716	size_t		queries_host;
717	size_t		queries_cname;
718	size_t		queries_failure;
719};
720
721struct s_ramqueue {
722	size_t		hosts;
723	size_t		batches;
724	size_t		envelopes;
725	size_t		hosts_max;
726	size_t		batches_max;
727	size_t		envelopes_max;
728};
729
730struct stats {
731	struct s_parent		 parent;
732	struct s_queue		 queue;
733	struct s_runner		 runner;
734	struct s_session	 mta;
735	struct s_mda		 mda;
736	struct s_session	 smtp;
737	struct s_control	 control;
738	struct s_lka		 lka;
739	struct s_ramqueue	 ramqueue;
740};
741
742struct reload {
743	int			fd;
744	int			ret;
745};
746
747struct submit_status {
748	u_int64_t			 id;
749	int				 code;
750	union submit_path {
751		struct path		 path;
752		u_int32_t		 msgid;
753		u_int64_t		 evpid;
754		char			 errormsg[MAX_LINE_SIZE];
755	}				 u;
756	enum message_flags		 flags;
757	struct sockaddr_storage		 ss;
758	struct message			 msg;
759};
760
761struct forward_req {
762	u_int64_t			 id;
763	u_int8_t			 status;
764	char				 pw_name[MAXLOGNAME];
765};
766
767struct dns {
768	u_int64_t		 id;
769	char			 host[MAXHOSTNAMELEN];
770	int			 port;
771	int			 error;
772	int			 type;
773	struct imsgev		*asker;
774	struct sockaddr_storage	 ss;
775	struct smtpd		*env;
776	struct dns		*next;
777};
778
779struct secret {
780	u_int64_t		 id;
781	objid_t			 secmapid;
782	char			 host[MAXHOSTNAMELEN];
783	char			 secret[MAX_LINE_SIZE];
784};
785
786struct mda_session {
787	LIST_ENTRY(mda_session)	 entry;
788	struct message		 msg;
789	struct msgbuf		 w;
790	struct event		 ev;
791	u_int32_t		 id;
792	FILE			*datafp;
793};
794
795struct deliver {
796	char			to[PATH_MAX];
797	char			user[MAXLOGNAME];
798	short			mode;
799};
800
801struct rulematch {
802	u_int64_t		 id;
803	struct submit_status	 ss;
804};
805
806enum lkasession_flags {
807	F_ERROR		= 0x1
808};
809
810struct lkasession {
811	SPLAY_ENTRY(lkasession)		 nodes;
812	u_int64_t			 id;
813
814	struct path			 path;
815	struct deliverylist    		 deliverylist;
816
817	struct expandtree		 expandtree;
818
819	u_int8_t			 iterations;
820	u_int32_t			 pending;
821	enum lkasession_flags		 flags;
822	struct message			 message;
823	struct submit_status		 ss;
824};
825
826struct mx {
827        char    host[MAXHOSTNAMELEN];
828        int     prio;
829};
830
831struct dnssession {
832        SPLAY_ENTRY(dnssession)          nodes;
833        u_int64_t                        id;
834        struct dns                       query;
835        struct event                     ev;
836        struct asr_query                *aq;
837        struct mx                        mxarray[MAX_MX_COUNT];
838        size_t                           mxarraysz;
839        size_t                           mxcurrent;
840	size_t				 mxfound;
841};
842
843enum mta_state {
844	MTA_INVALID_STATE,
845	MTA_INIT,
846	MTA_SECRET,
847	MTA_DATA,
848	MTA_MX,
849	MTA_CONNECT,
850	MTA_PTR,
851	MTA_PROTOCOL,
852	MTA_DONE
853};
854
855/* mta session flags */
856#define	MTA_FORCE_ANYSSL	0x01
857#define	MTA_FORCE_SMTPS		0x02
858#define	MTA_ALLOW_PLAIN		0x04
859#define	MTA_USE_AUTH		0x08
860#define	MTA_FORCE_MX		0x10
861
862struct mta_relay {
863	TAILQ_ENTRY(mta_relay)	 entry;
864	struct sockaddr_storage	 sa;
865	char			 fqdn[MAXHOSTNAMELEN];
866	int			 used;
867};
868
869struct mta_session {
870	SPLAY_ENTRY(mta_session) entry;
871	u_int64_t		 id;
872	struct smtpd		*env;
873	enum mta_state		 state;
874	char			*host;
875	int			 port;
876	int			 flags;
877	TAILQ_HEAD(,message)	 recipients;
878	TAILQ_HEAD(,mta_relay)	 relays;
879	objid_t			 secmapid;
880	char			*secret;
881	int			 fd;
882	FILE			*datafp;
883	struct event		 ev;
884	char			*cert;
885	void			*pcb;
886	struct ramqueue_batch	*batch;
887};
888
889
890/* maps return structures */
891struct map_secret {
892	char username[MAX_LINE_SIZE];
893	char password[MAX_LINE_SIZE];
894};
895
896struct map_alias {
897	size_t			nbnodes;
898	struct expandtree	expandtree;
899};
900
901struct map_virtual {
902	size_t			nbnodes;
903	struct expandtree	expandtree;
904};
905
906
907/* queue structures */
908enum queue_type {
909	QT_INVALID=0,
910	QT_FS
911};
912
913enum queue_kind {
914	Q_INVALID=0,
915	Q_ENQUEUE,
916	Q_INCOMING,
917	Q_QUEUE,
918	Q_PURGE,
919	Q_OFFLINE,
920	Q_BOUNCE
921};
922
923enum queue_op {
924	QOP_INVALID=0,
925	QOP_CREATE,
926	QOP_DELETE,
927	QOP_UPDATE,
928	QOP_COMMIT,
929	QOP_LOAD,
930	QOP_FD_R,
931	QOP_FD_RW,
932	QOP_PURGE
933};
934
935struct queue_backend {
936	enum queue_type	type;
937	int (*init)(struct smtpd *);
938	int (*message)(struct smtpd *, enum queue_kind, enum queue_op, u_int32_t *);
939	int (*envelope)(struct smtpd *, enum queue_kind, enum queue_op,
940		struct message *);
941};
942
943extern void (*imsg_callback)(struct smtpd *, struct imsgev *, struct imsg *);
944
945
946
947/* aliases.c */
948int aliases_exist(struct smtpd *, objid_t, char *);
949int aliases_get(struct smtpd *, objid_t, struct expandtree *, char *);
950int aliases_vdomain_exists(struct smtpd *, objid_t, char *);
951int aliases_virtual_exist(struct smtpd *, objid_t, struct path *);
952int aliases_virtual_get(struct smtpd *, objid_t, struct expandtree *, struct path *);
953int alias_parse(struct expandnode *, char *);
954
955
956/* authenticate.c */
957int authenticate_user(char *, char *);
958
959
960/* bounce.c */
961int bounce_session(struct smtpd *, int, struct message *);
962int bounce_session_switch(struct smtpd *, FILE *, enum session_state *, char *,
963	struct message *);
964void bounce_event(int, short, void *);
965
966
967/* config.c */
968#define		 PURGE_LISTENERS	0x01
969#define		 PURGE_MAPS		0x02
970#define		 PURGE_RULES		0x04
971#define		 PURGE_SSL		0x08
972#define		 PURGE_EVERYTHING	0xff
973void		 purge_config(struct smtpd *, u_int8_t);
974void		 unconfigure(struct smtpd *);
975void		 configure(struct smtpd *);
976void		 init_pipes(struct smtpd *);
977void		 config_pipes(struct smtpd *, struct peer *, u_int);
978void		 config_peers(struct smtpd *, struct peer *, u_int);
979
980
981/* control.c */
982pid_t		 control(struct smtpd *);
983void		 session_socket_blockmode(int, enum blockmodes);
984void		 session_socket_no_linger(int);
985int		 session_socket_error(int);
986
987
988/* dns.c */
989void		 dns_query_host(struct smtpd *, char *, int, u_int64_t);
990void		 dns_query_mx(struct smtpd *, char *, int, u_int64_t);
991void		 dns_query_ptr(struct smtpd *, struct sockaddr_storage *,
992    u_int64_t);
993void		 dns_async(struct smtpd *, struct imsgev *, int, struct dns *);
994
995
996/* enqueue.c */
997int		 enqueue(int, char **);
998int		 enqueue_offline(int, char **);
999
1000
1001/* expand.c */
1002int expand_cmp(struct expandnode *, struct expandnode *);
1003void expandtree_increment_node(struct expandtree *, struct expandnode *);
1004void expandtree_decrement_node(struct expandtree *, struct expandnode *);
1005void expandtree_remove_node(struct expandtree *, struct expandnode *);
1006struct expandnode *expandtree_lookup(struct expandtree *, struct expandnode *);
1007void expandtree_free_nodes(struct expandtree *);
1008RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp);
1009
1010
1011/* forward.c */
1012int forwards_get(int, struct expandtree *);
1013
1014
1015/* lka.c */
1016pid_t		 lka(struct smtpd *);
1017int		 lkasession_cmp(struct lkasession *, struct lkasession *);
1018int		 dnssession_cmp(struct dnssession *, struct dnssession *);
1019SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp);
1020SPLAY_PROTOTYPE(dnstree, dnssession, nodes, dnssession_cmp);
1021
1022
1023/* map.c */
1024void		*map_lookup(struct smtpd *, objid_t, char *, enum map_kind);
1025struct map	*map_find(struct smtpd *, objid_t);
1026struct map	*map_findbyname(struct smtpd *, const char *);
1027
1028
1029
1030/* mda.c */
1031pid_t		 mda(struct smtpd *);
1032
1033
1034/* mfa.c */
1035pid_t		mfa(struct smtpd *);
1036
1037
1038/* mta.c */
1039pid_t		 mta(struct smtpd *);
1040int		 mta_session_cmp(struct mta_session *, struct mta_session *);
1041SPLAY_PROTOTYPE(mtatree, mta_session, entry, mta_session_cmp);
1042
1043
1044/* parse.y */
1045int		 parse_config(struct smtpd *, const char *, int);
1046int		 cmdline_symset(char *);
1047
1048
1049/* queue.c */
1050pid_t		 queue(struct smtpd *);
1051int		 queue_load_envelope(struct message *, char *);
1052int		 queue_update_envelope(struct message *);
1053int		 queue_remove_envelope(struct message *);
1054void		 queue_submit_envelope(struct smtpd *, struct message *);
1055void		 queue_commit_envelopes(struct smtpd *, struct message*);
1056u_int16_t	 queue_hash(char *);
1057
1058
1059/* queue_backend.c */
1060struct queue_backend *queue_backend_lookup(enum queue_type);
1061int	queue_message_create(struct smtpd *, enum queue_kind, u_int32_t *);
1062int	queue_message_delete(struct smtpd *, enum queue_kind, u_int32_t);
1063int	queue_message_commit(struct smtpd *, enum queue_kind, u_int32_t);
1064int	queue_message_fd_r(struct smtpd *, enum queue_kind, u_int32_t);
1065int	queue_message_fd_rw(struct smtpd *, enum queue_kind, u_int32_t);
1066int	queue_message_purge(struct smtpd *, enum queue_kind, u_int32_t);
1067int	queue_envelope_create(struct smtpd *, enum queue_kind,
1068    struct message *);
1069int	queue_envelope_delete(struct smtpd *, enum queue_kind,
1070    struct message *);
1071int	queue_envelope_load(struct smtpd *, enum queue_kind,
1072    u_int64_t, struct message *);
1073int	queue_envelope_update(struct smtpd *, enum queue_kind,
1074    struct message *);
1075
1076
1077/* queue_shared.c */
1078int		 queue_create_layout_message(char *, char *);
1079int		 queue_record_layout_envelope(char *, struct message *);
1080int		 queue_remove_layout_envelope(char *, struct message *);
1081int		 queue_commit_layout_message(char *, struct message *);
1082int		 queue_open_layout_messagefile(char *, struct message *);
1083int		 enqueue_create_layout(char *);
1084void		 enqueue_delete_message(char *);
1085int		 enqueue_record_envelope(struct message *);
1086int		 enqueue_remove_envelope(struct message *);
1087int		 enqueue_commit_message(struct message *);
1088int		 enqueue_open_messagefile(struct message *);
1089int		 bounce_create_layout(struct smtpd *, char *, struct message *);
1090void		 bounce_delete_message(char *);
1091int		 bounce_record_envelope(struct message *);
1092int		 bounce_remove_envelope(struct message *);
1093int		 bounce_commit_message(struct message *);
1094int		 bounce_record_message(struct smtpd *, struct message *, struct message *);
1095int		 queue_create_incoming_layout(char *);
1096void		 queue_delete_incoming_message(char *);
1097int		 queue_record_incoming_envelope(struct message *);
1098int		 queue_remove_incoming_envelope(struct message *);
1099int		 queue_commit_incoming_message(struct message *);
1100int		 queue_open_incoming_message_file(struct message *);
1101int		 queue_open_message_file(char *msgid);
1102void		 queue_message_update(struct smtpd *, struct message *);
1103void		 queue_delete_message(char *);
1104struct qwalk	*qwalk_new(char *);
1105int		 qwalk(struct qwalk *, char *);
1106void		 qwalk_close(struct qwalk *);
1107void		 show_queue(char *, int);
1108u_int16_t	 queue_hash(char *);
1109
1110
1111/* ramqueue.c */
1112void		 ramqueue_init(struct smtpd *, struct ramqueue *);
1113int		 ramqueue_load(struct ramqueue *, time_t *);
1114int		 ramqueue_load_offline(struct ramqueue *);
1115int		 ramqueue_host_cmp(struct ramqueue_host *, struct ramqueue_host *);
1116void		 ramqueue_remove(struct ramqueue *, struct ramqueue_envelope *);
1117int		 ramqueue_is_empty(struct ramqueue *);
1118int		 ramqueue_is_empty(struct ramqueue *);
1119int		 ramqueue_batch_is_empty(struct ramqueue_batch *);
1120int		 ramqueue_host_is_empty(struct ramqueue_host *);
1121void		 ramqueue_remove_batch(struct ramqueue_host *, struct ramqueue_batch *);
1122void		 ramqueue_remove_host(struct ramqueue *, struct ramqueue_host *);
1123struct ramqueue_envelope *ramqueue_first_envelope(struct ramqueue *);
1124struct ramqueue_envelope *ramqueue_next_envelope(struct ramqueue *);
1125struct ramqueue_envelope *ramqueue_batch_first_envelope(struct ramqueue_batch *);
1126RB_PROTOTYPE(hosttree, ramqueue_host, host_entry, ramqueue_host_cmp);
1127
1128
1129/* runner.c */
1130pid_t		 runner(struct smtpd *);
1131void		 message_reset_flags(struct message *);
1132
1133
1134/* smtp.c */
1135pid_t		 smtp(struct smtpd *);
1136void		 smtp_resume(struct smtpd *);
1137
1138
1139/* smtp_session.c */
1140void		 session_init(struct listener *, struct session *);
1141int		 session_cmp(struct session *, struct session *);
1142void		 session_pickup(struct session *, struct submit_status *);
1143void		 session_destroy(struct session *);
1144void		 session_respond(struct session *, char *, ...)
1145		    __attribute__ ((format (printf, 2, 3)));
1146void		 session_bufferevent_new(struct session *);
1147
1148SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp);
1149
1150
1151/* smtpd.c */
1152int	 child_cmp(struct child *, struct child *);
1153SPLAY_PROTOTYPE(childtree, child, entry, child_cmp);
1154void	 imsg_event_add(struct imsgev *);
1155void	 imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t,
1156	    int, void *, u_int16_t);
1157void	 imsg_dispatch(int, short, void *);
1158
1159
1160/* ssl.c */
1161void	 ssl_init(void);
1162void	 ssl_transaction(struct session *);
1163
1164void	 ssl_session_init(struct session *);
1165void	 ssl_session_destroy(struct session *);
1166int	 ssl_load_certfile(struct smtpd *, const char *, u_int8_t);
1167void	 ssl_setup(struct smtpd *, struct listener *);
1168int	 ssl_cmp(struct ssl *, struct ssl *);
1169SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp);
1170
1171
1172/* ssl_privsep.c */
1173int	 ssl_ctx_use_private_key(void *, char *, off_t);
1174int	 ssl_ctx_use_certificate_chain(void *, char *, off_t);
1175
1176
1177/* util.c */
1178typedef struct arglist arglist;
1179struct arglist {
1180	char    **list;
1181	u_int   num;
1182	u_int   nalloc;
1183};
1184void		 addargs(arglist *, char *, ...)
1185		     __attribute__((format(printf, 2, 3)));
1186int		 bsnprintf(char *, size_t, const char *, ...)
1187    __attribute__ ((format (printf, 3, 4)));
1188int		 safe_fclose(FILE *);
1189int		 hostname_match(char *, char *);
1190int		 recipient_to_path(struct path *, char *);
1191int		 valid_localpart(char *);
1192int		 valid_domainpart(char *);
1193char		*ss_to_text(struct sockaddr_storage *);
1194int		 valid_message_id(char *);
1195int		 valid_message_uid(char *);
1196char		*time_to_text(time_t);
1197int		 secure_file(int, char *, struct passwd *, int);
1198void		 lowercase(char *, char *, size_t);
1199void		 message_set_errormsg(struct message *, char *, ...);
1200char		*message_get_errormsg(struct message *);
1201void		 sa_set_port(struct sockaddr *, int);
1202struct path	*path_dup(struct path *);
1203u_int64_t	 generate_uid(void);
1204void		 fdlimit(double);
1205int		 availdesc(void);
1206u_int32_t	evpid_to_msgid(u_int64_t);
1207u_int64_t	msgid_to_evpid(u_int32_t);
1208