smtpd.h revision 1.147
1/*	$OpenBSD: smtpd.h,v 1.147 2009/10/12 22:34:37 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#include			 <imsg.h>
21
22#ifndef nitems
23#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
24#endif
25
26#define IMSG_SIZE_CHECK(p) do {					\
27	if (IMSG_DATA_SIZE(&imsg) != sizeof(*p))		\
28		fatalx("bad length imsg received");		\
29} while (0)
30#define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
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	 65
42#define MAX_DOMAINPART_SIZE	 MAXHOSTNAMELEN
43#define MAX_ID_SIZE		 64
44
45/* return and forward path size */
46#define MAX_PATH_SIZE		 256
47
48#define SMTPD_QUEUE_INTERVAL	 (15 * 60)
49#define SMTPD_QUEUE_MAXINTERVAL	 (4 * 60 * 60)
50#define SMTPD_QUEUE_EXPIRY	 (4 * 24 * 60 * 60)
51#define SMTPD_USER		 "_smtpd"
52#define SMTPD_SOCKET		 "/var/run/smtpd.sock"
53#define SMTPD_BANNER		 "220 %s ESMTP OpenSMTPD"
54#define SMTPD_SESSION_TIMEOUT	 300
55#define SMTPD_BACKLOG		 5
56
57#define	PATH_MAILLOCAL		"/usr/libexec/mail.local"
58#define	PATH_SMTPCTL		"/usr/sbin/smtpctl"
59
60#define	DIRHASH_BUCKETS		 4096
61
62#define PATH_SPOOL		"/var/spool/smtpd"
63
64#define PATH_ENQUEUE		"/enqueue"
65#define PATH_INCOMING		"/incoming"
66#define PATH_QUEUE		"/queue"
67#define PATH_PURGE		"/purge"
68
69#define PATH_MESSAGE		"/message"
70#define PATH_ENVELOPES		"/envelopes"
71
72#define PATH_RUNQUEUE		"/runqueue"
73#define PATH_RUNQUEUEHIGH	"/runqueue-high"
74#define PATH_RUNQUEUELOW	"/runqueue-low"
75
76#define PATH_OFFLINE		"/offline"
77#define PATH_BOUNCE		"/bounce"
78
79/* number of MX records to lookup */
80#define MAX_MX_COUNT		10
81
82/* max response delay under flood conditions */
83#define MAX_RESPONSE_DELAY	60
84
85/* how many responses per state are undelayed */
86#define FAST_RESPONSES		2
87
88/* max len of any smtp line */
89#define	SMTP_LINE_MAX		16384
90
91#define F_STARTTLS		 0x01
92#define F_SMTPS			 0x02
93#define F_AUTH			 0x04
94#define F_SSL			(F_SMTPS|F_STARTTLS)
95
96#define F_SCERT			0x01
97#define F_CCERT			0x02
98
99#define ADVERTISE_TLS(s) \
100	((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE))
101
102#define ADVERTISE_AUTH(s) \
103	((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \
104	 !((s)->s_flags & F_AUTHENTICATED))
105
106struct netaddr {
107	struct sockaddr_storage ss;
108	int bits;
109};
110
111struct relayhost {
112	u_int8_t flags;
113	char hostname[MAXHOSTNAMELEN];
114	u_int16_t port;
115	char cert[PATH_MAX];
116};
117
118enum imsg_type {
119	IMSG_NONE,
120	IMSG_CTL_OK,		/* answer to smtpctl requests */
121	IMSG_CTL_FAIL,
122	IMSG_CTL_SHUTDOWN,
123	IMSG_CONF_START,
124	IMSG_CONF_SSL,
125	IMSG_CONF_SSL_CERT,
126	IMSG_CONF_SSL_KEY,
127	IMSG_CONF_LISTENER,
128	IMSG_CONF_MAP,
129	IMSG_CONF_MAP_CONTENT,
130	IMSG_CONF_RULE,
131	IMSG_CONF_RULE_SOURCE,
132	IMSG_CONF_CONDITION,
133	IMSG_CONF_OPTION,
134	IMSG_CONF_END,
135	IMSG_CONF_RELOAD,
136	IMSG_LKA_MAIL,
137	IMSG_LKA_RCPT,
138	IMSG_LKA_SECRET,
139	IMSG_LKA_RULEMATCH,
140	IMSG_MDA_FINALIZE,
141	IMSG_MFA_RCPT,
142	IMSG_MFA_MAIL,
143
144	IMSG_QUEUE_CREATE_MESSAGE,
145	IMSG_QUEUE_SUBMIT_ENVELOPE,
146	IMSG_QUEUE_COMMIT_ENVELOPES,
147	IMSG_QUEUE_REMOVE_MESSAGE,
148	IMSG_QUEUE_COMMIT_MESSAGE,
149	IMSG_QUEUE_TEMPFAIL,
150	IMSG_QUEUE_STATS,
151
152	IMSG_QUEUE_REMOVE_SUBMISSION,
153	IMSG_QUEUE_MESSAGE_UPDATE,
154	IMSG_QUEUE_MESSAGE_FD,
155	IMSG_QUEUE_MESSAGE_FILE,
156
157	IMSG_RUNNER_UPDATE_ENVELOPE,
158	IMSG_RUNNER_STATS,
159	IMSG_RUNNER_SCHEDULE,
160
161	IMSG_BATCH_CREATE,
162	IMSG_BATCH_APPEND,
163	IMSG_BATCH_CLOSE,
164
165	IMSG_PARENT_ENQUEUE_OFFLINE,
166	IMSG_PARENT_FORWARD_OPEN,
167	IMSG_PARENT_MAILBOX_OPEN,
168	IMSG_PARENT_MESSAGE_OPEN,
169	IMSG_PARENT_MAILDIR_RENAME,
170	IMSG_PARENT_MAILDIR_FAIL,
171	IMSG_PARENT_STATS,
172
173	IMSG_PARENT_AUTHENTICATE,
174	IMSG_PARENT_SEND_CONFIG,
175
176	IMSG_MDA_PAUSE,
177	IMSG_MTA_PAUSE,
178	IMSG_SMTP_PAUSE,
179	IMSG_SMTP_STATS,
180
181	IMSG_MDA_RESUME,
182	IMSG_MTA_RESUME,
183	IMSG_SMTP_RESUME,
184
185	IMSG_STATS,
186
187	IMSG_SMTP_ENQUEUE,
188
189	IMSG_DNS_A,
190	IMSG_DNS_A_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	short			 events;
206};
207
208struct ctl_conn {
209	TAILQ_ENTRY(ctl_conn)	 entry;
210	u_int8_t		 flags;
211#define CTL_CONN_NOTIFY		 0x01
212	struct imsgev		 iev;
213};
214TAILQ_HEAD(ctl_connlist, ctl_conn);
215
216typedef u_int32_t		 objid_t;
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_FILE,
251	S_DB,
252	S_EXT
253};
254
255enum mapel_type {
256	ME_STRING,
257	ME_NET,
258	ME_NETMASK
259};
260
261struct mapel {
262	TAILQ_ENTRY(mapel)		 me_entry;
263	union mapel_data {
264		char			 med_string[MAX_LINE_SIZE];
265		struct netaddr		 med_addr;
266	}				 me_key;
267	union mapel_data		 me_val;
268};
269
270struct map {
271	TAILQ_ENTRY(map)		 m_entry;
272#define F_USED				 0x01
273#define F_DYNAMIC			 0x02
274	u_int8_t			 m_flags;
275	char				 m_name[MAX_LINE_SIZE];
276	objid_t				 m_id;
277	enum map_type			 m_type;
278	enum mapel_type			 m_eltype;
279	enum map_src			 m_src;
280	char				 m_config[MAXPATHLEN];
281	TAILQ_HEAD(mapel_list, mapel)	 m_contents;
282};
283
284enum cond_type {
285	C_ALL,
286	C_NET,
287	C_DOM,
288	C_VDOM
289};
290
291struct cond {
292	TAILQ_ENTRY(cond)		 c_entry;
293	objid_t				 c_map;
294	enum cond_type			 c_type;
295	struct map			*c_match;
296};
297
298enum opt_type {
299	O_RWUSER,			/* rewrite user */
300	O_RWDOMAIN,			/* rewrite domain */
301};
302
303struct opt {
304	TAILQ_ENTRY(opt)		 o_entry;
305	enum opt_type			 o_type;
306};
307
308enum action_type {
309	A_INVALID,
310	A_RELAY,
311	A_RELAYVIA,
312	A_MAILDIR,
313	A_MBOX,
314	A_FILENAME,
315	A_EXT
316};
317
318#define IS_MAILBOX(x)	((x).rule.r_action == A_MAILDIR || (x).rule.r_action == A_MBOX || (x).rule.r_action == A_FILENAME)
319#define IS_RELAY(x)	((x).rule.r_action == A_RELAY || (x).rule.r_action == A_RELAYVIA)
320#define IS_EXT(x)	((x).rule.r_action == A_EXT)
321
322struct rule {
323	TAILQ_ENTRY(rule)		 r_entry;
324	int				 r_accept;
325	struct map			*r_sources;
326	TAILQ_HEAD(condlist, cond)	 r_conditions;
327	enum action_type		 r_action;
328	union rule_dest {
329		char			 path[MAXPATHLEN];
330		struct relayhost       	 relayhost;
331#define	MAXCOMMANDLEN	256
332		char			 command[MAXCOMMANDLEN];
333	}				 r_value;
334	TAILQ_HEAD(optlist, opt)	 r_options;
335};
336
337enum path_flags {
338	F_PATH_ALIAS = 0x1,
339	F_PATH_VIRTUAL = 0x2,
340	F_PATH_EXPANDED = 0x4,
341	F_PATH_NOFORWARD = 0x8,
342	F_PATH_FORWARDED = 0x10,
343	F_PATH_ACCOUNT = 0x20,
344	F_PATH_AUTHENTICATED = 0x40,
345};
346
347struct path {
348	TAILQ_ENTRY(path)		 entry;
349	struct rule			 rule;
350	struct cond			*cond;
351	enum path_flags			 flags;
352	u_int8_t			 forwardcnt;
353	char				 user[MAX_LOCALPART_SIZE];
354	char				 domain[MAX_DOMAINPART_SIZE];
355	char				 pw_name[MAXLOGNAME];
356	union path_data {
357		char filename[MAXPATHLEN];
358		char filter[MAXPATHLEN];
359	}				 u;
360};
361
362enum alias_type {
363	ALIAS_USERNAME,
364	ALIAS_FILENAME,
365	ALIAS_FILTER,
366	ALIAS_INCLUDE,
367	ALIAS_ADDRESS
368};
369
370struct alias {
371	TAILQ_ENTRY(alias)		entry;
372	enum alias_type			 type;
373	union alias_data {
374		char username[MAXLOGNAME];
375		char filename[MAXPATHLEN];
376		char filter[MAXPATHLEN];
377		struct path path;
378	}                                   u;
379};
380TAILQ_HEAD(aliaseslist, alias);
381
382enum message_type {
383	T_MDA_MESSAGE		= 0x1,
384	T_MTA_MESSAGE		= 0x2,
385	T_BOUNCE_MESSAGE	= 0x4
386};
387
388enum message_status {
389	S_MESSAGE_LOCKFAILURE	= 0x1,
390	S_MESSAGE_PERMFAILURE	= 0x2,
391	S_MESSAGE_TEMPFAILURE	= 0x4,
392	S_MESSAGE_REJECTED	= 0x8,
393	S_MESSAGE_ACCEPTED	= 0x10,
394	S_MESSAGE_RETRY		= 0x20,
395	S_MESSAGE_EDNS		= 0x40,
396	S_MESSAGE_ECONNECT	= 0x80
397};
398
399enum message_flags {
400	F_MESSAGE_RESOLVED	= 0x1,
401	F_MESSAGE_SCHEDULED	= 0x2,
402	F_MESSAGE_PROCESSING	= 0x4,
403	F_MESSAGE_AUTHENTICATED	= 0x8,
404	F_MESSAGE_ENQUEUED	= 0x10,
405	F_MESSAGE_FORCESCHEDULE	= 0x20,
406	F_MESSAGE_BOUNCE	= 0x40
407};
408
409struct message {
410	TAILQ_ENTRY(message)		 entry;
411
412	enum message_type		 type;
413
414	u_int64_t			 id;
415	u_int64_t			 session_id;
416	u_int64_t			 batch_id;
417
418	char				 message_id[MAX_ID_SIZE];
419	char				 message_uid[MAX_ID_SIZE];
420
421	char				 session_helo[MAXHOSTNAMELEN];
422	char				 session_hostname[MAXHOSTNAMELEN];
423	char				 session_errorline[MAX_LINE_SIZE];
424	struct sockaddr_storage		 session_ss;
425	struct path			 session_rcpt;
426
427	struct path			 sender;
428	struct path			 recipient;
429
430	time_t				 creation;
431	time_t				 lasttry;
432	u_int8_t			 retry;
433	enum message_flags		 flags;
434	enum message_status		 status;
435};
436
437enum batch_type {
438	T_MDA_BATCH		= 0x1,
439	T_MTA_BATCH		= 0x2,
440	T_BOUNCE_BATCH		= 0x4
441};
442
443struct batch {
444	SPLAY_ENTRY(batch)	 b_nodes;
445
446	u_int64_t		 id;
447	enum batch_type		 type;
448	struct rule		 rule;
449
450	struct smtpd		*env;
451
452	char			 message_id[MAX_ID_SIZE];
453	char			 hostname[MAXHOSTNAMELEN];
454
455	struct message		 message;
456	TAILQ_HEAD(, message)	 messages;
457
458	FILE			*mboxfp;
459	FILE			*datafp;
460	int			 cleanup_parent;
461};
462
463enum child_type {
464	CHILD_INVALID,
465	CHILD_DAEMON,
466	CHILD_MDA,
467	CHILD_ENQUEUE_OFFLINE
468};
469
470struct child {
471	SPLAY_ENTRY(child)	 entry;
472
473	pid_t			 pid;
474	enum child_type		 type;
475	enum smtp_proc_type	 title;
476	struct batch		 mda_batch;
477};
478
479enum session_state {
480	S_INVALID = 0,
481	S_INIT,
482	S_GREETED,
483	S_TLS,
484	S_AUTH_INIT,
485	S_AUTH_USERNAME,
486	S_AUTH_PASSWORD,
487	S_AUTH_FINALIZE,
488	S_HELO,
489	S_MAIL_MFA,
490	S_MAIL_QUEUE,
491	S_MAIL,
492	S_RCPT_MFA,
493	S_RCPT,
494	S_DATA,
495	S_DATA_QUEUE,
496	S_DATACONTENT,
497	S_DONE,
498	S_QUIT
499};
500#define STATE_COUNT	18
501
502struct ssl {
503	SPLAY_ENTRY(ssl)	 ssl_nodes;
504	char			 ssl_name[PATH_MAX];
505	char			*ssl_cert;
506	off_t			 ssl_cert_len;
507	char			*ssl_key;
508	off_t			 ssl_key_len;
509	u_int8_t		 flags;
510};
511
512struct listener {
513	u_int8_t		 flags;
514	int			 fd;
515	struct sockaddr_storage	 ss;
516	in_port_t		 port;
517	struct timeval		 timeout;
518	struct event		 ev;
519	struct smtpd		*env;
520	char			 ssl_cert_name[PATH_MAX];
521	struct ssl		*ssl;
522	void			*ssl_ctx;
523	TAILQ_ENTRY(listener)	 entry;
524};
525
526struct auth {
527	u_int64_t	 id;
528	char		 user[MAXLOGNAME];
529	char		 pass[MAX_LINE_SIZE];
530	int		 success;
531};
532
533enum session_flags {
534	F_EHLO		= 0x1,
535	F_QUIT		= 0x2,
536	F_8BITMIME	= 0x4,
537	F_SECURE	= 0x8,
538	F_AUTHENTICATED	= 0x10,
539	F_PEERHASTLS	= 0x20,
540	F_PEERHASAUTH	= 0x40,
541	F_WRITEONLY	= 0x80
542};
543
544struct session {
545	SPLAY_ENTRY(session)		 s_nodes;
546	u_int64_t			 s_id;
547
548	enum session_flags		 s_flags;
549	enum session_state		 s_state;
550	int				 s_fd;
551	struct sockaddr_storage		 s_ss;
552	char				 s_hostname[MAXHOSTNAMELEN];
553	struct event			 s_ev;
554	struct bufferevent		*s_bev;
555	struct listener			*s_l;
556	struct smtpd			*s_env;
557	void				*s_ssl;
558	u_char				*s_buf;
559	int				 s_buflen;
560	struct timeval			 s_tv;
561	struct message			 s_msg;
562	short				 s_nresp[STATE_COUNT];
563	size_t				 rcptcount;
564	long				 s_datalen;
565
566	struct auth			 s_auth;
567	struct batch			*batch;
568
569	FILE				*datafp;
570	int				 mboxfd;
571	int				 messagefd;
572};
573
574struct smtpd {
575	char					 sc_conffile[MAXPATHLEN];
576
577#define SMTPD_OPT_VERBOSE			 0x00000001
578#define SMTPD_OPT_NOACTION			 0x00000002
579	u_int32_t				 sc_opts;
580#define SMTPD_CONFIGURING			 0x00000001
581#define SMTPD_EXITING				 0x00000002
582#define SMTPD_MDA_PAUSED		       	 0x00000004
583#define SMTPD_MTA_PAUSED		       	 0x00000008
584#define SMTPD_SMTP_PAUSED		       	 0x00000010
585	u_int32_t				 sc_flags;
586	struct timeval				 sc_qintval;
587	u_int32_t				 sc_maxconn;
588	struct event				 sc_ev;
589	int					 *sc_pipes[PROC_COUNT]
590							[PROC_COUNT];
591	struct imsgev				*sc_ievs[PROC_COUNT];
592	int					 sc_instances[PROC_COUNT];
593	int					 sc_instance;
594	char					*sc_title[PROC_COUNT];
595	struct passwd				*sc_pw;
596	char					 sc_hostname[MAXHOSTNAMELEN];
597	TAILQ_HEAD(listenerlist, listener)	*sc_listeners;
598	TAILQ_HEAD(maplist, map)		*sc_maps, *sc_maps_reload;
599	TAILQ_HEAD(rulelist, rule)		*sc_rules, *sc_rules_reload;
600	SPLAY_HEAD(sessiontree, session)	 sc_sessions;
601	SPLAY_HEAD(msgtree, message)		 sc_messages;
602	SPLAY_HEAD(ssltree, ssl)		*sc_ssl;
603
604	SPLAY_HEAD(batchtree, batch)		 batch_queue;
605	SPLAY_HEAD(childtree, child)		 children;
606	SPLAY_HEAD(lkatree, lkasession)		 lka_sessions;
607	SPLAY_HEAD(mtatree, mta_session)	 mta_sessions;
608
609	struct stats				*stats;
610};
611
612struct s_parent {
613	time_t		start;
614};
615
616struct s_queue {
617	size_t		inserts_local;
618	size_t		inserts_remote;
619};
620
621struct s_runner {
622	size_t		active;
623};
624
625struct s_session {
626	size_t		sessions;
627	size_t		sessions_active;
628
629	size_t		smtps;
630	size_t		smtps_active;
631
632	size_t		starttls;
633	size_t		starttls_active;
634
635	size_t		read_error;
636	size_t		read_timeout;
637	size_t		read_eof;
638	size_t		write_error;
639	size_t		write_timeout;
640	size_t		write_eof;
641	size_t		toofast;
642	size_t		tempfail;
643	size_t		linetoolong;
644	size_t		delays;
645};
646
647struct s_mda {
648	size_t		write_error;
649};
650
651struct stats {
652	struct s_parent		 parent;
653	struct s_queue		 queue;
654	struct s_runner		 runner;
655	struct s_session	 mta;
656	struct s_mda		 mda;
657	struct s_session	 smtp;
658};
659
660struct sched {
661	int			fd;
662	char			mid[MAX_ID_SIZE];
663	int			ret;
664};
665
666struct reload {
667	int			fd;
668	int			ret;
669};
670
671struct submit_status {
672	u_int64_t			 id;
673	int				 code;
674	union submit_path {
675		struct path		 path;
676		char			 msgid[MAX_ID_SIZE];
677		char			 errormsg[MAX_LINE_SIZE];
678	}				 u;
679	enum message_flags		 flags;
680	struct sockaddr_storage		 ss;
681	struct message			 msg;
682};
683
684struct forward_req {
685	u_int64_t			 id;
686	u_int8_t			 status;
687	char				 pw_name[MAXLOGNAME];
688};
689
690struct dns {
691	u_int64_t		 id;
692	char			 host[MAXHOSTNAMELEN];
693	int			 port;
694	int			 error;
695	struct sockaddr_storage	 ss;
696	struct smtpd		*env;
697	struct dns		*next;
698};
699
700struct secret {
701	u_int64_t		 id;
702	char			 host[MAXHOSTNAMELEN];
703	char			 secret[MAX_LINE_SIZE];
704};
705
706struct rulematch {
707	u_int64_t		 id;
708	struct submit_status	 ss;
709};
710
711enum lkasession_flags {
712	F_ERROR		= 0x1
713};
714
715struct lkasession {
716	SPLAY_ENTRY(lkasession)		 nodes;
717	u_int64_t			 id;
718
719	struct path			 path;
720	struct aliaseslist		 aliaseslist;
721	u_int8_t			 iterations;
722	u_int32_t			 pending;
723	enum lkasession_flags		 flags;
724	struct message			 message;
725	struct submit_status		 ss;
726};
727
728enum mta_state {
729	MTA_INVALID_STATE,
730	MTA_INIT,
731	MTA_SECRET,
732	MTA_DATA,
733	MTA_MX,
734	MTA_CONNECT,
735	MTA_PROTOCOL,
736	MTA_DONE
737};
738
739/* mta session flags */
740#define	MTA_FORCE_ANYSSL	0x1
741#define	MTA_FORCE_SMTPS		0x2
742#define	MTA_ALLOW_PLAIN		0x4
743#define	MTA_USE_AUTH		0x8
744
745struct mta_relay {
746	TAILQ_ENTRY(mta_relay)	 entry;
747	struct sockaddr_storage	 sa;
748	int			 used;
749};
750
751struct mta_session {
752	SPLAY_ENTRY(mta_session) entry;
753	u_int64_t		 id;
754	struct smtpd		*env;
755	enum mta_state		 state;
756	char			*host;
757	int			 port;
758	int			 flags;
759	TAILQ_HEAD(,message)	 recipients;
760	TAILQ_HEAD(,mta_relay)	 relays;
761	char			*secret;
762	int			 datafd;
763	struct event		 ev;
764	char			*cert;
765	void			*smtp_state;
766};
767
768/* aliases.c */
769int aliases_exist(struct smtpd *, char *);
770int aliases_get(struct smtpd *, struct aliaseslist *, char *);
771int aliases_vdomain_exists(struct smtpd *, struct map *, char *);
772int aliases_virtual_exist(struct smtpd *, struct map *, struct path *);
773int aliases_virtual_get(struct smtpd *, struct map *, struct aliaseslist *, struct path *);
774int alias_parse(struct alias *, char *);
775
776/* authenticate.c */
777int authenticate_user(char *, char *);
778
779/* bounce.c */
780void bounce_process(struct smtpd *, struct message *);
781int bounce_session(struct smtpd *, int, struct message *);
782int bounce_session_switch(struct smtpd *, FILE *, enum session_state *, char *,
783	struct message *);
784
785/* log.c */
786void		log_init(int);
787void		log_warn(const char *, ...)
788    __attribute__ ((format (printf, 1, 2)));
789void		log_warnx(const char *, ...)
790    __attribute__ ((format (printf, 1, 2)));
791void		log_info(const char *, ...)
792    __attribute__ ((format (printf, 1, 2)));
793void		log_debug(const char *, ...)
794    __attribute__ ((format (printf, 1, 2)));
795__dead void	fatal(const char *);
796__dead void	fatalx(const char *);
797
798
799/* dns.c */
800void		 dns_query_a(struct smtpd *, char *, int, u_int64_t);
801void		 dns_query_mx(struct smtpd *, char *, int, u_int64_t);
802void		 dns_query_ptr(struct smtpd *, struct sockaddr_storage *,
803		     u_int64_t);
804void		 dns_async(struct smtpd *, struct imsgev *, int,
805		     struct dns *);
806
807
808/* forward.c */
809int forwards_get(int, struct aliaseslist *);
810
811/* smtpd.c */
812int	 child_cmp(struct child *, struct child *);
813SPLAY_PROTOTYPE(childtree, child, entry, child_cmp);
814void	 imsg_event_add(struct imsgev *);
815int	 imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t,
816	    int, void *, u_int16_t);
817
818/* lka.c */
819pid_t		 lka(struct smtpd *);
820int		 lkasession_cmp(struct lkasession *, struct lkasession *);
821SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp);
822
823/* mfa.c */
824pid_t		 mfa(struct smtpd *);
825int		 msg_cmp(struct message *, struct message *);
826
827/* queue.c */
828pid_t		 queue(struct smtpd *);
829u_int64_t	 queue_generate_id(void);
830int		 queue_load_envelope(struct message *, char *);
831int		 queue_update_envelope(struct message *);
832int		 queue_remove_envelope(struct message *);
833int		 batch_cmp(struct batch *, struct batch *);
834struct batch    *batch_by_id(struct smtpd *, u_int64_t);
835u_int16_t	 queue_hash(char *);
836
837/* queue_shared.c */
838int		 queue_create_layout_message(char *, char *);
839void		 queue_delete_layout_message(char *, char *);
840int		 queue_record_layout_envelope(char *, struct message *);
841int		 queue_remove_layout_envelope(char *, struct message *);
842int		 queue_commit_layout_message(char *, struct message *);
843int		 queue_open_layout_messagefile(char *, struct message *);
844int		 enqueue_create_layout(char *);
845void		 enqueue_delete_message(char *);
846int		 enqueue_record_envelope(struct message *);
847int		 enqueue_remove_envelope(struct message *);
848int		 enqueue_commit_message(struct message *);
849int		 enqueue_open_messagefile(struct message *);
850int		 bounce_create_layout(char *, struct message *);
851void		 bounce_delete_message(char *);
852int		 bounce_record_envelope(struct message *);
853int		 bounce_remove_envelope(struct message *);
854int		 bounce_commit_message(struct message *);
855int		 bounce_record_message(struct message *);
856int		 queue_create_incoming_layout(char *);
857void		 queue_delete_incoming_message(char *);
858int		 queue_record_incoming_envelope(struct message *);
859int		 queue_remove_incoming_envelope(struct message *);
860int		 queue_commit_incoming_message(struct message *);
861int		 queue_open_incoming_message_file(struct message *);
862int		 queue_open_message_file(char *msgid);
863void		 queue_message_update(struct message *);
864void		 queue_delete_message(char *);
865struct qwalk	*qwalk_new(char *);
866int		 qwalk(struct qwalk *, char *);
867void		 qwalk_close(struct qwalk *);
868void		 show_queue(char *, int);
869
870u_int16_t	queue_hash(char *);
871
872/* map.c */
873char		*map_dblookup(struct smtpd *, char *, char *);
874
875/* mda.c */
876pid_t		 mda(struct smtpd *);
877
878/* mta.c */
879pid_t		 mta(struct smtpd *);
880int		 mta_session_cmp(struct mta_session *, struct mta_session *);
881SPLAY_PROTOTYPE(mtatree, mta_session, entry, mta_session_cmp);
882
883/* control.c */
884pid_t		 control(struct smtpd *);
885void		 session_socket_blockmode(int, enum blockmodes);
886void		 session_socket_no_linger(int);
887int		 session_socket_error(int);
888
889/* enqueue.c */
890int		 enqueue(int, char **);
891int		 enqueue_offline(int, char **);
892
893/* runner.c */
894pid_t		 runner(struct smtpd *);
895void		 message_reset_flags(struct message *);
896SPLAY_PROTOTYPE(batchtree, batch, b_nodes, batch_cmp);
897
898/* smtp.c */
899pid_t		 smtp(struct smtpd *);
900
901/* smtp_session.c */
902void		 session_init(struct listener *, struct session *);
903int		 session_cmp(struct session *, struct session *);
904void		 session_pickup(struct session *, struct submit_status *);
905void		 session_destroy(struct session *);
906void		 session_respond(struct session *, char *, ...)
907		    __attribute__ ((format (printf, 2, 3)));
908void		 session_bufferevent_new(struct session *);
909
910SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp);
911
912/* config.c */
913#define		 PURGE_LISTENERS	0x01
914#define		 PURGE_MAPS		0x02
915#define		 PURGE_RULES		0x04
916#define		 PURGE_SSL		0x08
917#define		 PURGE_EVERYTHING	0xff
918void		 purge_config(struct smtpd *, u_int8_t);
919void		 unconfigure(struct smtpd *);
920void		 configure(struct smtpd *);
921void		 init_pipes(struct smtpd *);
922void		 config_pipes(struct smtpd *, struct peer *, u_int);
923void		 config_peers(struct smtpd *, struct peer *, u_int);
924
925/* parse.y */
926int		 parse_config(struct smtpd *, const char *, int);
927int		 cmdline_symset(char *);
928
929/* ssl.c */
930void	 ssl_init(void);
931void	 ssl_transaction(struct session *);
932
933void	 ssl_session_init(struct session *);
934void	 ssl_session_destroy(struct session *);
935int	 ssl_load_certfile(struct smtpd *, const char *, u_int8_t);
936void	 ssl_setup(struct smtpd *, struct listener *);
937int	 ssl_cmp(struct ssl *, struct ssl *);
938SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp);
939
940/* ssl_privsep.c */
941int	 ssl_ctx_use_private_key(void *, char *, off_t);
942int	 ssl_ctx_use_certificate_chain(void *, char *, off_t);
943
944/* map.c */
945struct map	*map_find(struct smtpd *, objid_t);
946struct map	*map_findbyname(struct smtpd *, const char *);
947
948/* util.c */
949typedef struct arglist arglist;
950struct arglist {
951	char    **list;
952	u_int   num;
953	u_int   nalloc;
954};
955void		 addargs(arglist *, char *, ...)
956		     __attribute__((format(printf, 2, 3)));
957int		 bsnprintf(char *, size_t, const char *, ...)
958    __attribute__ ((format (printf, 3, 4)));
959int		 safe_fclose(FILE *);
960int		 hostname_match(char *, char *);
961int		 recipient_to_path(struct path *, char *);
962int		 valid_localpart(char *);
963int		 valid_domainpart(char *);
964char		*ss_to_text(struct sockaddr_storage *);
965int		 valid_message_id(char *);
966int		 valid_message_uid(char *);
967char		*time_to_text(time_t);
968int		 secure_file(int, char *, struct passwd *, int);
969void		 lowercase(char *, char *, size_t);
970void		 message_set_errormsg(struct message *, char *, ...);
971char		*message_get_errormsg(struct message *);
972void		 sa_set_port(struct sockaddr *, int);
973