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