smtpd.h revision 1.321
1/*	$OpenBSD: smtpd.h,v 1.321 2012/08/18 15:45:12 eric Exp $	*/
2
3/*
4 * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.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 "filter_api.h"
26#include "ioev.h"
27#include "iobuf.h"
28
29#define CONF_FILE		 "/etc/mail/smtpd.conf"
30#define MAX_LISTEN		 16
31#define PROC_COUNT		 9
32#define MAX_NAME_SIZE		 64
33
34#define MAX_HOPS_COUNT		 100
35
36#define MAX_TAG_SIZE		 32
37/* SYNC WITH filter.h		  */
38//#define MAX_LINE_SIZE		 1024
39//#define MAX_LOCALPART_SIZE	 128
40//#define MAX_DOMAINPART_SIZE	 MAXHOSTNAMELEN
41
42/* return and forward path size */
43#define	MAX_FILTER_NAME		 32
44#define MAX_PATH_SIZE		 256
45#define MAX_RULEBUFFER_LEN	 256
46
47#define SMTPD_QUEUE_INTERVAL	 (15 * 60)
48#define SMTPD_QUEUE_MAXINTERVAL	 (4 * 60 * 60)
49#define SMTPD_QUEUE_EXPIRY	 (4 * 24 * 60 * 60)
50#define SMTPD_USER		 "_smtpd"
51#define SMTPD_FILTER_USER      	 "_smtpmfa"
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_SMTPCTL		"/usr/sbin/smtpctl"
58
59#define	DIRHASH_BUCKETS		 4096
60
61#define PATH_SPOOL		"/var/spool/smtpd"
62#define PATH_OFFLINE		"/offline"
63#define PATH_PURGE		"/purge"
64#define PATH_INCOMING		"/incoming"
65#define PATH_ENVELOPES		"/envelopes"
66#define PATH_MESSAGE		"/message"
67
68/* number of MX records to lookup */
69#define MAX_MX_COUNT		10
70
71/* max response delay under flood conditions */
72#define MAX_RESPONSE_DELAY	60
73
74/* how many responses per state are undelayed */
75#define FAST_RESPONSES		2
76
77/* max len of any smtp line */
78#define	SMTP_LINE_MAX		1024
79
80#define F_STARTTLS		 0x01
81#define F_SMTPS			 0x02
82#define F_AUTH			 0x04
83#define F_SSL			(F_SMTPS|F_STARTTLS)
84
85#define F_SCERT			0x01
86#define F_CCERT			0x02
87
88/* must match F_* for mta */
89#define ROUTE_STARTTLS		0x01
90#define ROUTE_SMTPS		0x02
91#define ROUTE_SSL		(ROUTE_STARTTLS | ROUTE_SMTPS)
92#define ROUTE_AUTH		0x04
93#define ROUTE_MX		0x08
94
95typedef u_int32_t	objid_t;
96
97struct netaddr {
98	struct sockaddr_storage ss;
99	int bits;
100};
101
102struct relayhost {
103	u_int8_t flags;
104	char hostname[MAXHOSTNAMELEN];
105	u_int16_t port;
106	char cert[PATH_MAX];
107	char authmap[MAX_PATH_SIZE];
108};
109
110enum imsg_type {
111	IMSG_NONE,
112	IMSG_CTL_OK,		/* answer to smtpctl requests */
113	IMSG_CTL_FAIL,
114	IMSG_CTL_SHUTDOWN,
115	IMSG_CTL_VERBOSE,
116	IMSG_CONF_START,
117	IMSG_CONF_SSL,
118	IMSG_CONF_LISTENER,
119	IMSG_CONF_MAP,
120	IMSG_CONF_MAP_CONTENT,
121	IMSG_CONF_RULE,
122	IMSG_CONF_RULE_SOURCE,
123	IMSG_CONF_FILTER,
124	IMSG_CONF_END,
125	IMSG_LKA_MAIL,
126	IMSG_LKA_RCPT,
127	IMSG_LKA_SECRET,
128	IMSG_LKA_RULEMATCH,
129	IMSG_MDA_SESS_NEW,
130	IMSG_MDA_DONE,
131
132	IMSG_MFA_CONNECT,
133 	IMSG_MFA_HELO,
134 	IMSG_MFA_MAIL,
135 	IMSG_MFA_RCPT,
136 	IMSG_MFA_DATALINE,
137	IMSG_MFA_QUIT,
138	IMSG_MFA_CLOSE,
139	IMSG_MFA_RSET,
140
141	IMSG_QUEUE_CREATE_MESSAGE,
142	IMSG_QUEUE_SUBMIT_ENVELOPE,
143	IMSG_QUEUE_COMMIT_ENVELOPES,
144	IMSG_QUEUE_REMOVE_MESSAGE,
145	IMSG_QUEUE_COMMIT_MESSAGE,
146	IMSG_QUEUE_TEMPFAIL,
147	IMSG_QUEUE_PAUSE_MDA,
148	IMSG_QUEUE_PAUSE_MTA,
149	IMSG_QUEUE_RESUME_MDA,
150	IMSG_QUEUE_RESUME_MTA,
151
152	IMSG_QUEUE_DELIVERY_OK,
153	IMSG_QUEUE_DELIVERY_TEMPFAIL,
154	IMSG_QUEUE_DELIVERY_PERMFAIL,
155	IMSG_QUEUE_MESSAGE_FD,
156	IMSG_QUEUE_MESSAGE_FILE,
157	IMSG_QUEUE_REMOVE,
158	IMSG_QUEUE_EXPIRE,
159
160	IMSG_SCHEDULER_REMOVE,
161	IMSG_SCHEDULER_SCHEDULE,
162
163	IMSG_BATCH_CREATE,
164	IMSG_BATCH_APPEND,
165	IMSG_BATCH_CLOSE,
166
167	IMSG_PARENT_FORWARD_OPEN,
168	IMSG_PARENT_FORK_MDA,
169
170	IMSG_PARENT_AUTHENTICATE,
171	IMSG_PARENT_SEND_CONFIG,
172
173	IMSG_STATS,
174	IMSG_SMTP_ENQUEUE,
175	IMSG_SMTP_PAUSE,
176	IMSG_SMTP_RESUME,
177
178	IMSG_DNS_HOST,
179	IMSG_DNS_HOST_END,
180	IMSG_DNS_MX,
181	IMSG_DNS_PTR
182};
183
184enum blockmodes {
185	BM_NORMAL,
186	BM_NONBLOCK
187};
188
189struct imsgev {
190	struct imsgbuf		 ibuf;
191	void			(*handler)(int, short, void *);
192	struct event		 ev;
193	void			*data;
194	int			 proc;
195	short			 events;
196};
197
198struct ctl_conn {
199	TAILQ_ENTRY(ctl_conn)	 entry;
200	u_int8_t		 flags;
201#define CTL_CONN_NOTIFY		 0x01
202	struct imsgev		 iev;
203};
204TAILQ_HEAD(ctl_connlist, ctl_conn);
205
206struct ctl_id {
207	objid_t		 id;
208	char		 name[MAX_NAME_SIZE];
209};
210
211enum smtp_proc_type {
212	PROC_PARENT = 0,
213	PROC_SMTP,
214	PROC_MFA,
215	PROC_LKA,
216	PROC_QUEUE,
217	PROC_MDA,
218	PROC_MTA,
219	PROC_CONTROL,
220	PROC_SCHEDULER,
221} smtpd_process;
222
223struct peer {
224	enum smtp_proc_type	 id;
225	void			(*cb)(int, short, void *);
226};
227
228enum map_src {
229	S_NONE,
230	S_PLAIN,
231	S_DB
232};
233
234enum map_kind {
235	K_NONE,
236	K_ALIAS,
237	K_VIRTUAL,
238	K_CREDENTIALS,
239	K_NETADDR
240};
241
242enum mapel_type {
243	ME_STRING,
244	ME_NET,
245	ME_NETMASK
246};
247
248struct mapel {
249	TAILQ_ENTRY(mapel)		 me_entry;
250	union mapel_data {
251		char			 med_string[MAX_LINE_SIZE];
252	}				 me_key;
253	union mapel_data		 me_val;
254};
255
256struct map {
257	TAILQ_ENTRY(map)		 m_entry;
258	char				 m_name[MAX_LINE_SIZE];
259	objid_t				 m_id;
260	enum mapel_type			 m_eltype;
261	enum map_src			 m_src;
262	char				 m_config[MAXPATHLEN];
263	TAILQ_HEAD(mapel_list, mapel)	 m_contents;
264};
265
266
267struct map_backend {
268	void *(*open)(struct map *);
269	void (*close)(void *);
270	void *(*lookup)(void *, char *, enum map_kind);
271	int  (*compare)(void *, char *, enum map_kind, int (*)(char *, char *));
272};
273
274
275enum cond_type {
276	C_ALL,
277	C_NET,
278	C_DOM,
279	C_VDOM
280};
281
282struct cond {
283	TAILQ_ENTRY(cond)		 c_entry;
284	objid_t				 c_map;
285	enum cond_type			 c_type;
286};
287
288enum action_type {
289	A_RELAY,
290	A_RELAYVIA,
291	A_MAILDIR,
292	A_MBOX,
293	A_FILENAME,
294	A_MDA
295};
296
297#define IS_MAILBOX(x)	((x).r_action == A_MAILDIR || (x).r_action == A_MBOX || (x).r_action == A_FILENAME)
298#define IS_RELAY(x)	((x).r_action == A_RELAY || (x).r_action == A_RELAYVIA)
299
300struct rule {
301	TAILQ_ENTRY(rule)		 r_entry;
302	char				 r_tag[MAX_TAG_SIZE];
303	int				 r_accept;
304	struct map			*r_sources;
305	struct cond			 r_condition;
306	enum action_type		 r_action;
307	union rule_dest {
308		char			 buffer[MAX_RULEBUFFER_LEN];
309		struct relayhost       	 relayhost;
310	}				 r_value;
311
312	char				*r_user;
313	struct mailaddr			*r_as;
314	objid_t				 r_amap;
315	time_t				 r_qexpire;
316};
317
318struct mailaddr {
319	char	user[MAX_LOCALPART_SIZE];
320	char	domain[MAX_DOMAINPART_SIZE];
321};
322
323enum delivery_type {
324	D_MDA,
325	D_MTA,
326	D_BOUNCE
327};
328
329enum delivery_status {
330	DS_PERMFAILURE	= 0x1,
331	DS_TEMPFAILURE	= 0x2,
332};
333
334enum delivery_flags {
335	DF_AUTHENTICATED	= 0x1,
336	DF_ENQUEUED		= 0x2,
337	DF_BOUNCE		= 0x4,
338	DF_INTERNAL		= 0x8 /* internal expansion forward */
339};
340
341union delivery_data {
342	char user[MAXLOGNAME];
343	char buffer[MAX_RULEBUFFER_LEN];
344	struct mailaddr mailaddr;
345};
346
347struct delivery_mda {
348	enum action_type	method;
349	union delivery_data	to;
350	char			as_user[MAXLOGNAME];
351};
352
353struct delivery_mta {
354	struct relayhost relay;
355};
356
357enum expand_type {
358	EXPAND_INVALID,
359	EXPAND_USERNAME,
360	EXPAND_FILENAME,
361	EXPAND_FILTER,
362	EXPAND_INCLUDE,
363	EXPAND_ADDRESS
364};
365
366enum expand_flags {
367	F_EXPAND_NONE,
368	F_EXPAND_DONE
369};
370
371struct expandnode {
372	RB_ENTRY(expandnode)	entry;
373	size_t			refcnt;
374	enum expand_flags      	flags;
375	enum expand_type       	type;
376	char			as_user[MAXLOGNAME];
377	union delivery_data    	u;
378};
379
380RB_HEAD(expandtree, expandnode);
381
382#define	SMTPD_ENVELOPE_VERSION		1
383struct envelope {
384	TAILQ_ENTRY(envelope)		entry;
385
386	char				tag[MAX_TAG_SIZE];
387	struct rule			rule;
388
389	u_int64_t			session_id;
390	u_int64_t			batch_id;
391
392	u_int32_t			version;
393	u_int64_t			id;
394	enum delivery_type		type;
395
396	char				helo[MAXHOSTNAMELEN];
397	char				hostname[MAXHOSTNAMELEN];
398	char				errorline[MAX_LINE_SIZE + 1];
399	struct sockaddr_storage		ss;
400
401	struct mailaddr			sender;
402	struct mailaddr			rcpt;
403	struct mailaddr			dest;
404
405	union delivery_method {
406		struct delivery_mda	mda;
407		struct delivery_mta	mta;
408	} agent;
409
410	time_t				 creation;
411	time_t				 lasttry;
412	time_t				 expire;
413	u_int8_t			 retry;
414	enum delivery_flags		 flags;
415};
416TAILQ_HEAD(deliverylist, envelope);
417
418enum envelope_field {
419	EVP_VERSION,
420	EVP_ID,
421	EVP_MSGID,
422	EVP_TYPE,
423	EVP_HELO,
424	EVP_HOSTNAME,
425	EVP_ERRORLINE,
426	EVP_SOCKADDR,
427	EVP_SENDER,
428	EVP_RCPT,
429	EVP_DEST,
430	EVP_CTIME,
431	EVP_EXPIRE,
432	EVP_RETRY,
433	EVP_LASTTRY,
434	EVP_FLAGS,
435	EVP_MDA_METHOD,
436	EVP_MDA_BUFFER,
437	EVP_MDA_USER,
438	EVP_MTA_RELAY_HOST,
439	EVP_MTA_RELAY_PORT,
440	EVP_MTA_RELAY_FLAGS,
441	EVP_MTA_RELAY_CERT,
442	EVP_MTA_RELAY_AUTHMAP
443};
444
445
446enum child_type {
447	CHILD_INVALID,
448	CHILD_DAEMON,
449	CHILD_MDA,
450	CHILD_ENQUEUE_OFFLINE,
451};
452
453struct child {
454	SPLAY_ENTRY(child)	 entry;
455	pid_t			 pid;
456	enum child_type		 type;
457	enum smtp_proc_type	 title;
458	int			 mda_out;
459	u_int32_t		 mda_id;
460	char			*path;
461};
462
463enum session_state {
464	S_NEW = 0,
465	S_CONNECTED,
466	S_INIT,
467	S_GREETED,
468	S_TLS,
469	S_AUTH_INIT,
470	S_AUTH_USERNAME,
471	S_AUTH_PASSWORD,
472	S_AUTH_FINALIZE,
473	S_RSET,
474	S_HELO,
475	S_MAIL_MFA,
476	S_MAIL_QUEUE,
477	S_MAIL,
478	S_RCPT_MFA,
479	S_RCPT,
480	S_DATA,
481	S_DATA_QUEUE,
482	S_DATACONTENT,
483	S_DONE,
484	S_QUIT,
485	S_CLOSE
486};
487#define STATE_COUNT	22
488
489struct ssl {
490	SPLAY_ENTRY(ssl)	 ssl_nodes;
491	char			 ssl_name[PATH_MAX];
492	char			*ssl_ca;
493	off_t			 ssl_ca_len;
494	char			*ssl_cert;
495	off_t			 ssl_cert_len;
496	char			*ssl_key;
497	off_t			 ssl_key_len;
498	char			*ssl_dhparams;
499	off_t			 ssl_dhparams_len;
500	u_int8_t		 flags;
501};
502
503struct listener {
504	u_int8_t		 flags;
505	int			 fd;
506	struct sockaddr_storage	 ss;
507	in_port_t		 port;
508	struct timeval		 timeout;
509	struct event		 ev;
510	char			 ssl_cert_name[PATH_MAX];
511	struct ssl		*ssl;
512	void			*ssl_ctx;
513	char			 tag[MAX_TAG_SIZE];
514	TAILQ_ENTRY(listener)	 entry;
515};
516
517struct auth {
518	u_int64_t	 id;
519	char		 user[MAXLOGNAME];
520	char		 pass[MAX_LINE_SIZE + 1];
521	int		 success;
522};
523
524enum session_flags {
525	F_EHLO		= 0x01,
526	F_8BITMIME	= 0x02,
527	F_SECURE	= 0x04,
528	F_AUTHENTICATED	= 0x08,
529	F_WAITIMSG	= 0x10,
530	F_ZOMBIE	= 0x20,
531};
532
533struct session {
534	SPLAY_ENTRY(session)		 s_nodes;
535	u_int64_t			 s_id;
536
537	struct iobuf			 s_iobuf;
538	struct io			 s_io;
539
540	enum session_flags		 s_flags;
541	enum session_state		 s_state;
542	struct sockaddr_storage		 s_ss;
543	char				 s_hostname[MAXHOSTNAMELEN];
544	struct event			 s_ev;
545	struct listener			*s_l;
546	void				*s_ssl;
547	struct timeval			 s_tv;
548	struct envelope			 s_msg;
549	short				 s_nresp[STATE_COUNT];
550	size_t				 rcptcount;
551	long				 s_datalen;
552
553	struct auth			 s_auth;
554	int				 s_dstatus;
555
556	FILE				*datafp;
557};
558
559
560struct smtpd {
561	char					 sc_conffile[MAXPATHLEN];
562	size_t					 sc_maxsize;
563
564#define SMTPD_OPT_VERBOSE			 0x00000001
565#define SMTPD_OPT_NOACTION			 0x00000002
566	u_int32_t				 sc_opts;
567#define SMTPD_CONFIGURING			 0x00000001
568#define SMTPD_EXITING				 0x00000002
569#define SMTPD_MDA_PAUSED		       	 0x00000004
570#define SMTPD_MTA_PAUSED		       	 0x00000008
571#define SMTPD_SMTP_PAUSED		       	 0x00000010
572#define SMTPD_MDA_BUSY			       	 0x00000020
573#define SMTPD_MTA_BUSY			       	 0x00000040
574#define SMTPD_BOUNCE_BUSY      		       	 0x00000080
575	u_int32_t				 sc_flags;
576	struct timeval				 sc_qintval;
577	int					 sc_qexpire;
578	u_int32_t				 sc_maxconn;
579	struct event				 sc_ev;
580	int					 *sc_pipes[PROC_COUNT]
581							[PROC_COUNT];
582	struct imsgev				*sc_ievs[PROC_COUNT];
583	int					 sc_instances[PROC_COUNT];
584	int					 sc_instance;
585	char					*sc_title[PROC_COUNT];
586	struct passwd				*sc_pw;
587	char					 sc_hostname[MAXHOSTNAMELEN];
588	struct queue_backend			*sc_queue;
589	struct scheduler_backend		*sc_scheduler;
590
591	TAILQ_HEAD(filterlist, filter)		*sc_filters;
592
593	TAILQ_HEAD(listenerlist, listener)	*sc_listeners;
594	TAILQ_HEAD(maplist, map)		*sc_maps, *sc_maps_reload;
595	TAILQ_HEAD(rulelist, rule)		*sc_rules, *sc_rules_reload;
596	SPLAY_HEAD(sessiontree, session)	 sc_sessions;
597	SPLAY_HEAD(ssltree, ssl)		*sc_ssl;
598	SPLAY_HEAD(childtree, child)		 children;
599	SPLAY_HEAD(lkatree, lka_session)	 lka_sessions;
600	SPLAY_HEAD(mfatree, mfa_session)	 mfa_sessions;
601	LIST_HEAD(mdalist, mda_session)		 mda_sessions;
602
603	struct stats				*stats;
604	u_int64_t				 filtermask;
605};
606
607#define	TRACE_VERBOSE	0x0001
608#define	TRACE_IMSG	0x0002
609#define	TRACE_IO	0x0004
610#define	TRACE_SMTP	0x0008
611#define	TRACE_MTA	0x0010
612#define	TRACE_BOUNCE	0x0020
613#define	TRACE_SCHEDULER	0x0040
614
615enum {
616	STATS_SMTP_SESSION = 0,
617	STATS_SMTP_SESSION_INET4,
618	STATS_SMTP_SESSION_INET6,
619	STATS_SMTP_SMTPS,
620	STATS_SMTP_STARTTLS,
621
622	STATS_MTA_SESSION,
623
624	STATS_MDA_SESSION,
625
626	STATS_CONTROL_SESSION,
627
628	STATS_LKA_SESSION,
629	STATS_LKA_SESSION_MX,
630	STATS_LKA_SESSION_HOST,
631	STATS_LKA_SESSION_CNAME,
632	STATS_LKA_FAILURE,
633
634	STATS_SCHEDULER,
635	STATS_SCHEDULER_BOUNCES,
636
637	STATS_QUEUE_LOCAL,
638	STATS_QUEUE_REMOTE,
639
640	STATS_RAMQUEUE_ENVELOPE,
641	STATS_RAMQUEUE_MESSAGE,
642	STATS_RAMQUEUE_BATCH,
643	STATS_RAMQUEUE_HOST,
644
645	STATS_MAX,
646};
647
648#define STAT_COUNT	0
649#define STAT_ACTIVE	1
650#define STAT_MAXACTIVE	2
651
652struct	stat_counter {
653	size_t	count;
654	size_t	active;
655	size_t	maxactive;
656};
657
658struct s_parent {
659	time_t		start;
660};
661
662struct s_session {
663	size_t		read_error;
664	size_t		read_timeout;
665	size_t		read_eof;
666	size_t		write_error;
667	size_t		write_timeout;
668	size_t		write_eof;
669	size_t		toofast;
670	size_t		tempfail;
671	size_t		linetoolong;
672	size_t		delays;
673};
674
675struct stats {
676	struct s_parent		 parent;
677	struct s_session	 mta;
678	struct s_session	 smtp;
679
680	struct stat_counter	 counters[STATS_MAX];
681};
682
683struct submit_status {
684	u_int64_t			 id;
685	int				 code;
686	union submit_path {
687		struct mailaddr		 maddr;
688		u_int32_t		 msgid;
689		u_int64_t		 evpid;
690		char			 errormsg[MAX_LINE_SIZE + 1];
691		char			 dataline[MAX_LINE_SIZE + 1];
692	}				 u;
693	enum delivery_flags		 flags;
694	struct sockaddr_storage		 ss;
695	struct envelope			 envelope;
696};
697
698struct forward_req {
699	u_int64_t			 id;
700	u_int8_t			 status;
701	char				 as_user[MAXLOGNAME];
702	struct envelope			 envelope;
703};
704
705enum dns_status {
706	DNS_OK = 0,
707	DNS_RETRY,
708	DNS_EINVAL,
709	DNS_ENONAME,
710	DNS_ENOTFOUND,
711};
712
713struct dns {
714	u_int64_t		 id;
715	char			 host[MAXHOSTNAMELEN];
716	int			 port;
717	int			 error;
718	int			 type;
719	struct imsgev		*asker;
720	struct sockaddr_storage	 ss;
721	struct dns		*next;
722};
723
724struct secret {
725	u_int64_t		 id;
726	char			 mapname[MAX_PATH_SIZE];
727	char			 host[MAXHOSTNAMELEN];
728	char			 secret[MAX_LINE_SIZE];
729};
730
731struct mda_session {
732	LIST_ENTRY(mda_session)	 entry;
733	struct envelope		 msg;
734	struct msgbuf		 w;
735	struct event		 ev;
736	u_int32_t		 id;
737	FILE			*datafp;
738};
739
740struct deliver {
741	char			to[PATH_MAX];
742	char			from[PATH_MAX];
743	char			user[MAXLOGNAME];
744	short			mode;
745};
746
747struct rulematch {
748	u_int64_t		 id;
749	struct submit_status	 ss;
750};
751
752enum lka_session_flags {
753	F_ERROR		= 0x1
754};
755
756struct lka_session {
757	SPLAY_ENTRY(lka_session)	 nodes;
758	u_int64_t			 id;
759
760	struct deliverylist		 deliverylist;
761	struct expandtree		 expandtree;
762
763	u_int8_t			 iterations;
764	u_int32_t			 pending;
765	enum lka_session_flags		 flags;
766	struct submit_status		 ss;
767};
768
769struct filter {
770	TAILQ_ENTRY(filter)     f_entry;
771	pid_t			pid;
772	struct event		ev;
773	struct imsgbuf		*ibuf;
774	char			name[MAX_FILTER_NAME];
775	char			path[MAXPATHLEN];
776};
777
778struct mfa_session {
779	SPLAY_ENTRY(mfa_session)	 nodes;
780	u_int64_t			 id;
781
782	enum session_state		 state;
783	struct submit_status		 ss;
784	struct filter			*filter;
785	struct filter_msg		 fm;
786};
787
788struct mta_session;
789
790struct mta_route {
791	SPLAY_ENTRY(mta_route)	 entry;
792	uint64_t		 id;
793
794	uint8_t			 flags;
795	char			*hostname;
796	uint16_t		 port;
797	char			*cert;
798	char			*auth;
799	void			*ssl;
800
801	/* route limits	*/
802	int			 maxconn; 	/* in parallel */
803	int			 maxmail;	/* per session */
804	int			 maxrcpt;	/* per mail */
805
806	int			 refcount;
807
808	int			 ntask;
809	TAILQ_HEAD(, mta_task)	 tasks;
810
811	int			 nsession;
812
813	int			 nfail;
814	char			 errorline[64];
815};
816
817struct mta_task {
818	TAILQ_ENTRY(mta_task)	 entry;
819	struct mta_route	*route;
820	uint32_t		 msgid;
821	TAILQ_HEAD(, envelope)	 envelopes;
822	struct mailaddr		 sender;
823	struct mta_session	*session;
824};
825
826struct mta_batch {
827	u_int64_t		id;
828	struct relayhost	relay;
829
830	u_int32_t		msgid;
831};
832
833/* maps return structures */
834struct map_credentials {
835	char username[MAX_LINE_SIZE];
836	char password[MAX_LINE_SIZE];
837};
838
839struct map_alias {
840	size_t			nbnodes;
841	struct expandtree	expandtree;
842};
843
844struct map_virtual {
845	size_t			nbnodes;
846	struct expandtree	expandtree;
847};
848
849struct map_netaddr {
850	struct netaddr		netaddr;
851};
852
853enum queue_op {
854	QOP_INVALID=0,
855	QOP_CREATE,
856	QOP_DELETE,
857	QOP_UPDATE,
858	QOP_COMMIT,
859	QOP_LOAD,
860	QOP_FD_R,
861	QOP_CORRUPT,
862};
863
864struct queue_backend {
865	int (*init)(int);
866	int (*message)(enum queue_op, u_int32_t *);
867	int (*envelope)(enum queue_op, struct envelope *);
868
869	void *(*qwalk_new)(u_int32_t);
870	int   (*qwalk)(void *, u_int64_t *);
871	void  (*qwalk_close)(void *);
872};
873
874
875/* auth structures */
876enum auth_type {
877	AUTH_BSD,
878	AUTH_PWD,
879};
880
881struct auth_backend {
882	int (*authenticate)(char *, char *);
883};
884
885
886/* user structures */
887enum user_type {
888	USER_PWD,
889};
890
891#define	MAXPASSWORDLEN	128
892struct mta_user {
893	char username[MAXLOGNAME];
894	char directory[MAXPATHLEN];
895	char password[MAXPASSWORDLEN];
896	uid_t uid;
897	gid_t gid;
898};
899
900struct user_backend {
901	int (*getbyname)(struct mta_user *, char *);
902	int (*getbyuid)(struct mta_user *, uid_t);
903};
904
905
906/* delivery_backend */
907struct delivery_backend {
908	void	(*open)(struct deliver *);
909};
910
911struct scheduler_info {
912	u_int64_t		evpid;
913	char			destination[MAXHOSTNAMELEN];
914
915	enum delivery_type	type;
916	time_t			creation;
917	time_t			lasttry;
918	time_t			expire;
919	u_int8_t		retry;
920};
921
922struct id_list {
923	struct id_list	*next;
924	uint64_t	 id;
925};
926
927#define SCHED_NONE		0x00
928#define SCHED_DELAY		0x01
929#define SCHED_REMOVE		0x02
930#define SCHED_EXPIRE		0x04
931#define SCHED_BOUNCE		0x08
932#define SCHED_MDA		0x10
933#define SCHED_MTA		0x20
934
935struct scheduler_batch {
936	int		 type;
937	time_t		 delay;
938	struct id_list	*evpids;
939};
940
941struct scheduler_backend {
942	void	(*init)(void);
943
944	void	(*insert)(struct scheduler_info *);
945	void	(*commit)(u_int32_t);
946	void	(*rollback)(u_int32_t);
947
948	void	(*update)(struct scheduler_info *);
949	void	(*delete)(u_int64_t);
950
951	void	(*batch)(int, time_t, struct scheduler_batch *);
952
953	void	(*schedule)(u_int64_t);
954	void	(*remove)(u_int64_t);
955};
956
957extern struct smtpd	*env;
958extern void (*imsg_callback)(struct imsgev *, struct imsg *);
959
960
961/* aliases.c */
962int aliases_exist(objid_t, char *);
963int aliases_get(objid_t, struct expandtree *, char *);
964int aliases_vdomain_exists(objid_t, char *);
965int aliases_virtual_exist(objid_t, struct mailaddr *);
966int aliases_virtual_get(objid_t, struct expandtree *, struct mailaddr *);
967int alias_parse(struct expandnode *, char *);
968
969
970/* auth.c */
971struct auth_backend *auth_backend_lookup(enum auth_type);
972
973
974/* bounce.c */
975void bounce_add(uint64_t);
976void bounce_run(uint64_t, int);
977
978
979/* config.c */
980#define PURGE_LISTENERS		0x01
981#define PURGE_MAPS		0x02
982#define PURGE_RULES		0x04
983#define PURGE_SSL		0x08
984#define PURGE_EVERYTHING	0xff
985void purge_config(u_int8_t);
986void unconfigure(void);
987void configure(void);
988void init_pipes(void);
989void config_pipes(struct peer *, u_int);
990void config_peers(struct peer *, u_int);
991
992
993/* control.c */
994pid_t control(void);
995void session_socket_blockmode(int, enum blockmodes);
996void session_socket_no_linger(int);
997int session_socket_error(int);
998
999
1000/* delivery.c */
1001struct delivery_backend *delivery_backend_lookup(enum action_type);
1002
1003
1004/* dns.c */
1005void dns_query_host(char *, int, u_int64_t);
1006void dns_query_mx(char *, int, u_int64_t);
1007void dns_query_ptr(struct sockaddr_storage *, u_int64_t);
1008void dns_async(struct imsgev *, int, struct dns *);
1009
1010
1011/* enqueue.c */
1012int		 enqueue(int, char **);
1013int		 enqueue_offline(int, char **);
1014
1015
1016/* envelope.c */
1017void envelope_set_errormsg(struct envelope *, char *, ...);
1018char *envelope_ascii_field_name(enum envelope_field);
1019int envelope_ascii_load(enum envelope_field, struct envelope *, char *);
1020int envelope_ascii_dump(enum envelope_field, struct envelope *, char *, size_t);
1021int envelope_load_file(struct envelope *, FILE *);
1022int envelope_dump_file(struct envelope *, FILE *);
1023
1024/* expand.c */
1025int expand_cmp(struct expandnode *, struct expandnode *);
1026void expandtree_increment_node(struct expandtree *, struct expandnode *);
1027void expandtree_decrement_node(struct expandtree *, struct expandnode *);
1028void expandtree_remove_node(struct expandtree *, struct expandnode *);
1029struct expandnode *expandtree_lookup(struct expandtree *, struct expandnode *);
1030void expandtree_free_nodes(struct expandtree *);
1031RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp);
1032
1033
1034/* forward.c */
1035int forwards_get(int, struct expandtree *, char *);
1036
1037
1038/* lka.c */
1039pid_t lka(void);
1040int lka_session_cmp(struct lka_session *, struct lka_session *);
1041SPLAY_PROTOTYPE(lkatree, lka_session, nodes, lka_session_cmp);
1042
1043/* lka_session.c */
1044struct lka_session *lka_session_init(struct submit_status *);
1045void lka_session_fail(struct lka_session *);
1046void lka_session_destroy(struct lka_session *);
1047
1048
1049/* map.c */
1050void *map_lookup(objid_t, char *, enum map_kind);
1051int map_compare(objid_t, char *, enum map_kind, int (*)(char *, char *));
1052struct map *map_find(objid_t);
1053struct map *map_findbyname(const char *);
1054
1055
1056/* mda.c */
1057pid_t mda(void);
1058
1059
1060/* mfa.c */
1061pid_t mfa(void);
1062int mfa_session_cmp(struct mfa_session *, struct mfa_session *);
1063SPLAY_PROTOTYPE(mfatree, mfa_session, nodes, mfa_session_cmp);
1064
1065/* mta.c */
1066pid_t mta(void);
1067int mta_response_delivery(const char *);
1068const char *mta_response_status(const char *);
1069const char *mta_response_text(const char *);
1070void mta_route_ok(struct mta_route *);
1071void mta_route_error(struct mta_route *, const char *);
1072void mta_route_collect(struct mta_route *);
1073const char *mta_route_to_text(struct mta_route *);
1074
1075/* mta_session.c */
1076void mta_session(struct mta_route *);
1077void mta_session_imsg(struct imsgev *, struct imsg *);
1078
1079/* parse.y */
1080int parse_config(struct smtpd *, const char *, int);
1081int cmdline_symset(char *);
1082
1083
1084/* queue.c */
1085pid_t queue(void);
1086
1087
1088/* queue_backend.c */
1089u_int32_t queue_generate_msgid(void);
1090u_int64_t queue_generate_evpid(u_int32_t msgid);
1091struct queue_backend *queue_backend_lookup(const char *);
1092int queue_message_incoming_path(u_int32_t, char *, size_t);
1093int queue_envelope_incoming_path(u_int64_t, char *, size_t);
1094int queue_message_incoming_delete(u_int32_t);
1095int queue_message_create(u_int32_t *);
1096int queue_message_delete(u_int32_t);
1097int queue_message_commit(u_int32_t);
1098int queue_message_fd_r(u_int32_t);
1099int queue_message_fd_rw(u_int32_t);
1100int queue_message_corrupt(u_int32_t);
1101int queue_envelope_create(struct envelope *);
1102int queue_envelope_delete(struct envelope *);
1103int queue_envelope_load(u_int64_t, struct envelope *);
1104int queue_envelope_update(struct envelope *);
1105void *qwalk_new(u_int32_t);
1106int   qwalk(void *, u_int64_t *);
1107void  qwalk_close(void *);
1108
1109
1110/* scheduler.c */
1111pid_t scheduler(void);
1112
1113/* scheduler_bakend.c */
1114struct scheduler_backend *scheduler_backend_lookup(const char *);
1115void scheduler_info(struct scheduler_info *, struct envelope *);
1116time_t scheduler_compute_schedule(struct scheduler_info *);
1117
1118/* smtp.c */
1119pid_t smtp(void);
1120void smtp_resume(void);
1121
1122
1123/* smtp_session.c */
1124void session_init(struct listener *, struct session *);
1125int session_cmp(struct session *, struct session *);
1126void session_io(struct io *, int);
1127void session_pickup(struct session *, struct submit_status *);
1128void session_destroy(struct session *, const char *);
1129void session_respond(struct session *, char *, ...)
1130	__attribute__ ((format (printf, 2, 3)));
1131
1132SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp);
1133
1134
1135/* smtpd.c */
1136int	 child_cmp(struct child *, struct child *);
1137void imsg_event_add(struct imsgev *);
1138void imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t,
1139    int, void *, u_int16_t);
1140void imsg_dispatch(int, short, void *);
1141const char * proc_to_str(int);
1142const char * imsg_to_str(int);
1143SPLAY_PROTOTYPE(childtree, child, entry, child_cmp);
1144
1145
1146/* ssl.c */
1147void ssl_init(void);
1148void ssl_transaction(struct session *);
1149void ssl_session_init(struct session *);
1150void ssl_session_destroy(struct session *);
1151int ssl_load_certfile(const char *, u_int8_t);
1152void ssl_setup(struct listener *);
1153int ssl_cmp(struct ssl *, struct ssl *);
1154void *ssl_mta_init(struct ssl *);
1155SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp);
1156
1157
1158/* ssl_privsep.c */
1159int	 ssl_ctx_use_private_key(void *, char *, off_t);
1160int	 ssl_ctx_use_certificate_chain(void *, char *, off_t);
1161
1162/* stats.c */
1163void	stat_init(struct stat_counter *, int);
1164size_t	stat_get(int, int);
1165size_t	stat_increment(int);
1166size_t	stat_decrement(int);
1167
1168
1169/* tree.c */
1170SPLAY_HEAD(tree, treeentry);
1171#define tree_init(t) SPLAY_INIT((t))
1172#define tree_empty(t) SPLAY_EMPTY((t))
1173int tree_check(struct tree *, uint64_t);
1174void *tree_set(struct tree *, uint64_t, void *);
1175void tree_xset(struct tree *, uint64_t, void *);
1176void *tree_get(struct tree *, uint64_t);
1177void *tree_xget(struct tree *, uint64_t);
1178void *tree_pop(struct tree *, uint64_t);
1179void *tree_xpop(struct tree *, uint64_t);
1180int tree_poproot(struct tree *, uint64_t *, void **);
1181int tree_root(struct tree *, uint64_t *, void **);
1182int tree_iter(struct tree *, void **, uint64_t *, void **);
1183void tree_merge(struct tree *, struct tree *);
1184
1185
1186/* user.c */
1187struct user_backend *user_backend_lookup(enum user_type);
1188
1189
1190/* util.c */
1191typedef struct arglist arglist;
1192struct arglist {
1193	char    **list;
1194	u_int   num;
1195	u_int   nalloc;
1196};
1197void addargs(arglist *, char *, ...)
1198	__attribute__((format(printf, 2, 3)));
1199int bsnprintf(char *, size_t, const char *, ...)
1200	__attribute__ ((format (printf, 3, 4)));
1201int mkdir_p(char *, mode_t);
1202int safe_fclose(FILE *);
1203int hostname_match(char *, char *);
1204int email_to_mailaddr(struct mailaddr *, char *);
1205int valid_localpart(const char *);
1206int valid_domainpart(const char *);
1207char *ss_to_text(struct sockaddr_storage *);
1208char *time_to_text(time_t);
1209char *duration_to_text(time_t);
1210int secure_file(int, char *, char *, uid_t, int);
1211int  lowercase(char *, char *, size_t);
1212void xlowercase(char *, char *, size_t);
1213void sa_set_port(struct sockaddr *, int);
1214u_int64_t generate_uid(void);
1215void fdlimit(double);
1216int availdesc(void);
1217u_int32_t evpid_to_msgid(u_int64_t);
1218u_int64_t msgid_to_evpid(u_int32_t);
1219void log_imsg(int, int, struct imsg*);
1220int ckdir(const char *, mode_t, uid_t, gid_t, int);
1221int rmtree(char *, int);
1222int mvpurge(char *, char *);
1223const char *parse_smtp_response(char *, size_t, char **, int *);
1224int text_to_netaddr(struct netaddr *, char *);
1225int text_to_relayhost(struct relayhost *, char *);
1226void *xmalloc(size_t, const char *);
1227void *xcalloc(size_t, size_t, const char *);
1228char *xstrdup(const char *, const char *);
1229