smtpd.h revision 1.584
1/*	$OpenBSD: smtpd.h,v 1.584 2018/12/09 17:37:15 gilles Exp $	*/
2
3/*
4 * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
6 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21#ifndef nitems
22#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
23#endif
24
25#include <netinet/in.h>
26#include <netdb.h>
27#include <event.h>
28
29#include "smtpd-defines.h"
30#include "smtpd-api.h"
31#include "ioev.h"
32
33#define CHECK_IMSG_DATA_SIZE(imsg, expected_sz) do {			\
34	if ((imsg)->hdr.len - IMSG_HEADER_SIZE != (expected_sz))	\
35		fatalx("smtpd: imsg %d: data size expected %zd got %zd",\
36	   	    (imsg)->hdr.type,					\
37	   	    (expected_sz), (imsg)->hdr.len - IMSG_HEADER_SIZE);	\
38} while (0)
39
40#define CONF_FILE		 "/etc/mail/smtpd.conf"
41#define MAILNAME_FILE		 "/etc/mail/mailname"
42#define CA_FILE			 "/etc/ssl/cert.pem"
43
44#define PROC_COUNT		 7
45
46#define MAX_HOPS_COUNT		 100
47#define	DEFAULT_MAX_BODY_SIZE	(35*1024*1024)
48
49#define	EXPAND_BUFFER		 1024
50
51#define SMTPD_QUEUE_EXPIRY	 (4 * 24 * 60 * 60)
52#define SMTPD_SOCKET		 "/var/run/smtpd.sock"
53#define	SMTPD_NAME		 "OpenSMTPD"
54#define	SMTPD_VERSION		 "6.4.0"
55#define SMTPD_SESSION_TIMEOUT	 300
56#define SMTPD_BACKLOG		 5
57
58#define	PATH_SMTPCTL		"/usr/sbin/smtpctl"
59
60#define PATH_OFFLINE		"/offline"
61#define PATH_PURGE		"/purge"
62#define PATH_TEMPORARY		"/temporary"
63
64#define	PATH_LIBEXEC		"/usr/local/libexec/smtpd"
65
66
67/*
68 * RFC 5322 defines these characters as valid, some of them are
69 * potentially dangerous and need to be escaped.
70 */
71#define	MAILADDR_ALLOWED       	"!#$%&'*/?^`{|}~+-=_"
72#define	MAILADDR_ESCAPE		"!#$%&'*/?^`{|}~"
73
74
75#define F_STARTTLS		0x01
76#define F_SMTPS			0x02
77#define F_SSL		       (F_STARTTLS | F_SMTPS)
78#define F_AUTH			0x08
79#define	F_STARTTLS_REQUIRE	0x20
80#define	F_AUTH_REQUIRE		0x40
81#define	F_MASK_SOURCE		0x100
82#define	F_TLS_VERIFY		0x200
83#define	F_EXT_DSN		0x400
84#define	F_RECEIVEDAUTH		0x800
85#define	F_MASQUERADE		0x1000
86#define	F_FILTERED		0x2000
87
88#define RELAY_TLS_OPPORTUNISTIC	0
89#define RELAY_TLS_STARTTLS	1
90#define RELAY_TLS_SMTPS		2
91#define RELAY_TLS_NO		3
92
93#define RELAY_AUTH		0x08
94#define RELAY_LMTP		0x80
95#define	RELAY_TLS_VERIFY	0x200
96
97#define MTA_EXT_DSN		0x400
98
99
100#define P_NEWALIASES	0
101#define P_MAKEMAP	1
102
103struct userinfo {
104	char username[SMTPD_VUSERNAME_SIZE];
105	char directory[PATH_MAX];
106	uid_t uid;
107	gid_t gid;
108};
109
110struct netaddr {
111	struct sockaddr_storage ss;
112	int bits;
113};
114
115struct relayhost {
116	uint16_t flags;
117	int tls;
118	char hostname[HOST_NAME_MAX+1];
119	uint16_t port;
120	char authlabel[PATH_MAX];
121};
122
123struct credentials {
124	char username[LINE_MAX];
125	char password[LINE_MAX];
126};
127
128struct destination {
129	char	name[HOST_NAME_MAX+1];
130};
131
132struct source {
133	struct sockaddr_storage	addr;
134};
135
136struct addrname {
137	struct sockaddr_storage	addr;
138	char			name[HOST_NAME_MAX+1];
139};
140
141union lookup {
142	struct expand		*expand;
143	struct credentials	 creds;
144	struct netaddr		 netaddr;
145	struct source		 source;
146	struct destination	 domain;
147	struct userinfo		 userinfo;
148	struct mailaddr		 mailaddr;
149	struct addrname		 addrname;
150	struct maddrmap		*maddrmap;
151	char			 relayhost[LINE_MAX];
152};
153
154/*
155 * Bump IMSG_VERSION whenever a change is made to enum imsg_type.
156 * This will ensure that we can never use a wrong version of smtpctl with smtpd.
157 */
158#define	IMSG_VERSION		16
159
160enum imsg_type {
161	IMSG_NONE,
162
163	IMSG_CTL_OK,
164	IMSG_CTL_FAIL,
165
166	IMSG_CTL_GET_DIGEST,
167	IMSG_CTL_GET_STATS,
168	IMSG_CTL_LIST_MESSAGES,
169	IMSG_CTL_LIST_ENVELOPES,
170	IMSG_CTL_MTA_SHOW_HOSTS,
171	IMSG_CTL_MTA_SHOW_RELAYS,
172	IMSG_CTL_MTA_SHOW_ROUTES,
173	IMSG_CTL_MTA_SHOW_HOSTSTATS,
174	IMSG_CTL_MTA_BLOCK,
175	IMSG_CTL_MTA_UNBLOCK,
176	IMSG_CTL_MTA_SHOW_BLOCK,
177	IMSG_CTL_PAUSE_EVP,
178	IMSG_CTL_PAUSE_MDA,
179	IMSG_CTL_PAUSE_MTA,
180	IMSG_CTL_PAUSE_SMTP,
181	IMSG_CTL_PROFILE,
182	IMSG_CTL_PROFILE_DISABLE,
183	IMSG_CTL_PROFILE_ENABLE,
184	IMSG_CTL_RESUME_EVP,
185	IMSG_CTL_RESUME_MDA,
186	IMSG_CTL_RESUME_MTA,
187	IMSG_CTL_RESUME_SMTP,
188	IMSG_CTL_RESUME_ROUTE,
189	IMSG_CTL_REMOVE,
190	IMSG_CTL_SCHEDULE,
191	IMSG_CTL_SHOW_STATUS,
192	IMSG_CTL_TRACE_DISABLE,
193	IMSG_CTL_TRACE_ENABLE,
194	IMSG_CTL_UPDATE_TABLE,
195	IMSG_CTL_VERBOSE,
196	IMSG_CTL_DISCOVER_EVPID,
197	IMSG_CTL_DISCOVER_MSGID,
198
199	IMSG_CTL_SMTP_SESSION,
200
201	IMSG_GETADDRINFO,
202	IMSG_GETADDRINFO_END,
203	IMSG_GETNAMEINFO,
204
205	IMSG_CERT_INIT,
206	IMSG_CERT_CERTIFICATE,
207	IMSG_CERT_VERIFY,
208
209	IMSG_SETUP_KEY,
210	IMSG_SETUP_PEER,
211	IMSG_SETUP_DONE,
212
213	IMSG_CONF_START,
214	IMSG_CONF_END,
215
216	IMSG_STAT_INCREMENT,
217	IMSG_STAT_DECREMENT,
218	IMSG_STAT_SET,
219
220	IMSG_LKA_AUTHENTICATE,
221	IMSG_LKA_OPEN_FORWARD,
222	IMSG_LKA_ENVELOPE_SUBMIT,
223	IMSG_LKA_ENVELOPE_COMMIT,
224
225	IMSG_QUEUE_DELIVER,
226	IMSG_QUEUE_DELIVERY_OK,
227	IMSG_QUEUE_DELIVERY_TEMPFAIL,
228	IMSG_QUEUE_DELIVERY_PERMFAIL,
229	IMSG_QUEUE_DELIVERY_LOOP,
230	IMSG_QUEUE_DISCOVER_EVPID,
231	IMSG_QUEUE_DISCOVER_MSGID,
232	IMSG_QUEUE_ENVELOPE_ACK,
233	IMSG_QUEUE_ENVELOPE_COMMIT,
234	IMSG_QUEUE_ENVELOPE_REMOVE,
235	IMSG_QUEUE_ENVELOPE_SCHEDULE,
236	IMSG_QUEUE_ENVELOPE_SUBMIT,
237	IMSG_QUEUE_HOLDQ_HOLD,
238	IMSG_QUEUE_HOLDQ_RELEASE,
239	IMSG_QUEUE_MESSAGE_COMMIT,
240	IMSG_QUEUE_MESSAGE_ROLLBACK,
241	IMSG_QUEUE_SMTP_SESSION,
242	IMSG_QUEUE_TRANSFER,
243
244	IMSG_MDA_DELIVERY_OK,
245	IMSG_MDA_DELIVERY_TEMPFAIL,
246	IMSG_MDA_DELIVERY_PERMFAIL,
247	IMSG_MDA_DELIVERY_LOOP,
248	IMSG_MDA_DELIVERY_HOLD,
249	IMSG_MDA_DONE,
250	IMSG_MDA_FORK,
251	IMSG_MDA_HOLDQ_RELEASE,
252	IMSG_MDA_LOOKUP_USERINFO,
253	IMSG_MDA_KILL,
254	IMSG_MDA_OPEN_MESSAGE,
255
256	IMSG_MFA_SMTP_RESPONSE,
257
258	IMSG_MTA_DELIVERY_OK,
259	IMSG_MTA_DELIVERY_TEMPFAIL,
260	IMSG_MTA_DELIVERY_PERMFAIL,
261	IMSG_MTA_DELIVERY_LOOP,
262	IMSG_MTA_DELIVERY_HOLD,
263	IMSG_MTA_DNS_HOST,
264	IMSG_MTA_DNS_HOST_END,
265	IMSG_MTA_DNS_MX,
266	IMSG_MTA_DNS_MX_PREFERENCE,
267	IMSG_MTA_HOLDQ_RELEASE,
268	IMSG_MTA_LOOKUP_CREDENTIALS,
269	IMSG_MTA_LOOKUP_SOURCE,
270	IMSG_MTA_LOOKUP_HELO,
271	IMSG_MTA_LOOKUP_SMARTHOST,
272	IMSG_MTA_OPEN_MESSAGE,
273	IMSG_MTA_SCHEDULE,
274	IMSG_MTA_TLS_INIT,
275	IMSG_MTA_TLS_VERIFY_CERT,
276	IMSG_MTA_TLS_VERIFY_CHAIN,
277	IMSG_MTA_TLS_VERIFY,
278
279	IMSG_SCHED_ENVELOPE_BOUNCE,
280	IMSG_SCHED_ENVELOPE_DELIVER,
281	IMSG_SCHED_ENVELOPE_EXPIRE,
282	IMSG_SCHED_ENVELOPE_INJECT,
283	IMSG_SCHED_ENVELOPE_REMOVE,
284	IMSG_SCHED_ENVELOPE_TRANSFER,
285
286	IMSG_SMTP_AUTHENTICATE,
287	IMSG_SMTP_MESSAGE_COMMIT,
288	IMSG_SMTP_MESSAGE_CREATE,
289	IMSG_SMTP_MESSAGE_ROLLBACK,
290	IMSG_SMTP_MESSAGE_OPEN,
291	IMSG_SMTP_CHECK_SENDER,
292	IMSG_SMTP_EXPAND_RCPT,
293	IMSG_SMTP_LOOKUP_HELO,
294	IMSG_SMTP_TLS_INIT,
295	IMSG_SMTP_TLS_VERIFY_CERT,
296	IMSG_SMTP_TLS_VERIFY_CHAIN,
297	IMSG_SMTP_TLS_VERIFY,
298
299	IMSG_SMTP_REQ_CONNECT,
300	IMSG_SMTP_REQ_HELO,
301	IMSG_SMTP_REQ_MAIL,
302	IMSG_SMTP_REQ_RCPT,
303	IMSG_SMTP_REQ_DATA,
304	IMSG_SMTP_REQ_EOM,
305	IMSG_SMTP_EVENT_RSET,
306	IMSG_SMTP_EVENT_COMMIT,
307	IMSG_SMTP_EVENT_ROLLBACK,
308	IMSG_SMTP_EVENT_DISCONNECT,
309
310	IMSG_LKA_PROCESSOR_FORK,
311
312	IMSG_SMTP_REPORT_LINK_CONNECT,
313	IMSG_SMTP_REPORT_LINK_DISCONNECT,
314	IMSG_SMTP_REPORT_LINK_TLS,
315	IMSG_SMTP_REPORT_TX_BEGIN,
316	IMSG_SMTP_REPORT_TX_MAIL,
317	IMSG_SMTP_REPORT_TX_RCPT,
318	IMSG_SMTP_REPORT_TX_ENVELOPE,
319	IMSG_SMTP_REPORT_TX_COMMIT,
320	IMSG_SMTP_REPORT_TX_ROLLBACK,
321	IMSG_SMTP_REPORT_PROTOCOL_CLIENT,
322	IMSG_SMTP_REPORT_PROTOCOL_SERVER,
323
324	IMSG_SMTP_FILTER_BEGIN,
325	IMSG_SMTP_FILTER_END,
326	IMSG_SMTP_FILTER_PROTOCOL,
327	IMSG_SMTP_FILTER_DATA_BEGIN,
328	IMSG_SMTP_FILTER_DATA_END,
329
330	IMSG_MTA_REPORT_LINK_CONNECT,
331	IMSG_MTA_REPORT_LINK_DISCONNECT,
332	IMSG_MTA_REPORT_LINK_TLS,
333	IMSG_MTA_REPORT_TX_BEGIN,
334	IMSG_MTA_REPORT_TX_MAIL,
335	IMSG_MTA_REPORT_TX_RCPT,
336	IMSG_MTA_REPORT_TX_ENVELOPE,
337	IMSG_MTA_REPORT_TX_COMMIT,
338	IMSG_MTA_REPORT_TX_ROLLBACK,
339	IMSG_MTA_REPORT_PROTOCOL_CLIENT,
340	IMSG_MTA_REPORT_PROTOCOL_SERVER,
341
342	IMSG_CA_PRIVENC,
343	IMSG_CA_PRIVDEC
344};
345
346enum smtp_proc_type {
347	PROC_PARENT = 0,
348	PROC_LKA,
349	PROC_QUEUE,
350	PROC_CONTROL,
351	PROC_SCHEDULER,
352	PROC_PONY,
353	PROC_CA,
354	PROC_PROCESSOR,
355	PROC_CLIENT,
356};
357
358enum table_type {
359	T_NONE		= 0,
360	T_DYNAMIC	= 0x01,	/* table with external source	*/
361	T_LIST		= 0x02,	/* table holding a list		*/
362	T_HASH		= 0x04,	/* table holding a hash table	*/
363};
364
365struct table {
366	char				 t_name[LINE_MAX];
367	enum table_type			 t_type;
368	char				 t_config[PATH_MAX];
369
370	struct dict			 t_dict;
371
372	void				*t_handle;
373	struct table_backend		*t_backend;
374	void				*t_iter;
375};
376
377struct table_backend {
378	const unsigned int	services;
379	int	(*config)(struct table *);
380	void   *(*open)(struct table *);
381	int	(*update)(struct table *);
382	void	(*close)(void *);
383	int	(*lookup)(void *, struct dict *, const char *, enum table_service, union lookup *);
384	int	(*fetch)(void *, struct dict *, enum table_service, union lookup *);
385};
386
387
388enum bounce_type {
389	B_FAILED,
390	B_DELAYED,
391	B_DELIVERED
392};
393
394enum dsn_ret {
395	DSN_RETFULL = 1,
396	DSN_RETHDRS
397};
398
399struct delivery_bounce {
400	enum bounce_type	type;
401	time_t			delay;
402	time_t			ttl;
403	enum dsn_ret		dsn_ret;
404        int			mta_without_dsn;
405};
406
407enum expand_type {
408	EXPAND_INVALID,
409	EXPAND_USERNAME,
410	EXPAND_FILENAME,
411	EXPAND_FILTER,
412	EXPAND_INCLUDE,
413	EXPAND_ADDRESS,
414	EXPAND_ERROR,
415};
416
417enum filter_phase {
418	FILTER_CONNECTED = 0,
419	FILTER_HELO,
420	FILTER_EHLO,
421	FILTER_STARTTLS,
422	FILTER_AUTH,
423	FILTER_MAIL_FROM,
424	FILTER_RCPT_TO,
425	FILTER_DATA,
426	FILTER_DATA_LINE,
427	FILTER_RSET,
428	FILTER_QUIT,
429	FILTER_NOOP,
430	FILTER_HELP,
431	FILTER_WIZ,
432	FILTER_COMMIT,
433	FILTER_PHASES_COUNT     /* must be last */
434};
435
436struct expandnode {
437	RB_ENTRY(expandnode)	entry;
438	TAILQ_ENTRY(expandnode)	tq_entry;
439	enum expand_type	type;
440	int			sameuser;
441	int			realuser;
442	int			forwarded;
443	struct rule	       *rule;
444	struct expandnode      *parent;
445	unsigned int		depth;
446	union {
447		/*
448		 * user field handles both expansion user and system user
449		 * so we MUST make it large enough to fit a mailaddr user
450		 */
451		char		user[SMTPD_MAXLOCALPARTSIZE];
452		char		buffer[EXPAND_BUFFER];
453		struct mailaddr	mailaddr;
454	}			u;
455};
456
457struct expand {
458	RB_HEAD(expandtree, expandnode)	 tree;
459	TAILQ_HEAD(xnodes, expandnode)	*queue;
460	size_t				 nb_nodes;
461	struct rule			*rule;
462	struct expandnode		*parent;
463};
464
465struct maddrnode {
466	TAILQ_ENTRY(maddrnode)		entries;
467	struct mailaddr			mailaddr;
468};
469
470struct maddrmap {
471	TAILQ_HEAD(xmaddr, maddrnode)	queue;
472};
473
474#define DSN_SUCCESS 0x01
475#define DSN_FAILURE 0x02
476#define DSN_DELAY   0x04
477#define DSN_NEVER   0x08
478
479#define	DSN_ENVID_LEN	100
480
481#define	SMTPD_ENVELOPE_VERSION		3
482struct envelope {
483	TAILQ_ENTRY(envelope)		entry;
484
485	char				dispatcher[HOST_NAME_MAX+1];
486
487	char				tag[SMTPD_TAG_SIZE];
488
489	uint32_t			version;
490	uint64_t			id;
491	enum envelope_flags		flags;
492
493	char				smtpname[HOST_NAME_MAX+1];
494	char				helo[HOST_NAME_MAX+1];
495	char				hostname[HOST_NAME_MAX+1];
496	char				errorline[LINE_MAX];
497	struct sockaddr_storage		ss;
498
499	struct mailaddr			sender;
500	struct mailaddr			rcpt;
501	struct mailaddr			dest;
502
503	char				mda_user[SMTPD_VUSERNAME_SIZE];
504	char				mda_exec[LINE_MAX];
505
506	enum delivery_type		type;
507	union {
508		struct delivery_bounce	bounce;
509	}				agent;
510
511	uint16_t			retry;
512	time_t				creation;
513	time_t				ttl;
514	time_t				lasttry;
515	time_t				nexttry;
516	time_t				lastbounce;
517
518	struct mailaddr			dsn_orcpt;
519	char				dsn_envid[DSN_ENVID_LEN+1];
520	uint8_t				dsn_notify;
521	enum dsn_ret			dsn_ret;
522
523	uint8_t				esc_class;
524	uint8_t				esc_code;
525};
526
527struct listener {
528	uint16_t       		 flags;
529	int			 fd;
530	struct sockaddr_storage	 ss;
531	in_port_t		 port;
532	struct timeval		 timeout;
533	struct event		 ev;
534	char			 pki_name[PATH_MAX];
535	char			 ca_name[PATH_MAX];
536	char			 tag[SMTPD_TAG_SIZE];
537	char			 authtable[LINE_MAX];
538	char			 hostname[HOST_NAME_MAX+1];
539	char			 hostnametable[PATH_MAX];
540	char			 sendertable[PATH_MAX];
541
542	TAILQ_ENTRY(listener)	 entry;
543
544	int			 local;		/* there must be a better way */
545};
546
547struct smtpd {
548	char				sc_conffile[PATH_MAX];
549	size_t				sc_maxsize;
550
551#define SMTPD_OPT_VERBOSE		0x00000001
552#define SMTPD_OPT_NOACTION		0x00000002
553	uint32_t			sc_opts;
554
555#define SMTPD_EXITING			0x00000001 /* unused */
556#define SMTPD_MDA_PAUSED		0x00000002
557#define SMTPD_MTA_PAUSED		0x00000004
558#define SMTPD_SMTP_PAUSED		0x00000008
559#define SMTPD_MDA_BUSY			0x00000010
560#define SMTPD_MTA_BUSY			0x00000020
561#define SMTPD_BOUNCE_BUSY		0x00000040
562#define SMTPD_SMTP_DISABLED		0x00000080
563	uint32_t			sc_flags;
564
565#define QUEUE_COMPRESSION      		0x00000001
566#define QUEUE_ENCRYPTION      		0x00000002
567#define QUEUE_EVPCACHE			0x00000004
568	uint32_t			sc_queue_flags;
569	char			       *sc_queue_key;
570	size_t				sc_queue_evpcache_size;
571
572	size_t				sc_session_max_rcpt;
573	size_t				sc_session_max_mails;
574
575	struct dict		       *sc_mda_wrappers;
576	size_t				sc_mda_max_session;
577	size_t				sc_mda_max_user_session;
578	size_t				sc_mda_task_hiwat;
579	size_t				sc_mda_task_lowat;
580	size_t				sc_mda_task_release;
581
582	size_t				sc_mta_max_deferred;
583
584	size_t				sc_scheduler_max_inflight;
585	size_t				sc_scheduler_max_evp_batch_size;
586	size_t				sc_scheduler_max_msg_batch_size;
587	size_t				sc_scheduler_max_schedule;
588
589	struct dict		       *sc_processors_dict;
590	struct dict		       *sc_smtp_reporters_dict;
591	struct dict		       *sc_mta_reporters_dict;
592
593	int				sc_ttl;
594#define MAX_BOUNCE_WARN			4
595	time_t				sc_bounce_warn[MAX_BOUNCE_WARN];
596	char				sc_hostname[HOST_NAME_MAX+1];
597	struct stat_backend	       *sc_stat;
598	struct compress_backend	       *sc_comp;
599
600	time_t					 sc_uptime;
601
602	/* This is a listener for a local socket used by smtp_enqueue(). */
603	struct listener                         *sc_sock_listener;
604
605	TAILQ_HEAD(listenerlist, listener)	*sc_listeners;
606
607	TAILQ_HEAD(rulelist, rule)		*sc_rules;
608	TAILQ_HEAD(filterrules, filter_rule)    sc_filter_rules[FILTER_PHASES_COUNT];
609
610	struct dict				*sc_dispatchers;
611	struct dispatcher			*sc_dispatcher_bounce;
612
613	struct dict			       *sc_ca_dict;
614	struct dict			       *sc_pki_dict;
615	struct dict			       *sc_ssl_dict;
616
617	struct dict			       *sc_tables_dict;		/* keyed lookup	*/
618
619	struct dict			       *sc_limits_dict;
620
621	char				       *sc_tls_ciphers;
622
623	char				       *sc_subaddressing_delim;
624};
625
626#define	TRACE_DEBUG	0x0001
627#define	TRACE_IMSG	0x0002
628#define	TRACE_IO	0x0004
629#define	TRACE_SMTP	0x0008
630#define	TRACE_FILTERS	0x0010
631#define	TRACE_MTA	0x0020
632#define	TRACE_BOUNCE	0x0040
633#define	TRACE_SCHEDULER	0x0080
634#define	TRACE_LOOKUP	0x0100
635#define	TRACE_STAT	0x0200
636#define	TRACE_RULES	0x0400
637#define	TRACE_MPROC	0x0800
638#define	TRACE_EXPAND	0x1000
639#define	TRACE_TABLES	0x2000
640#define	TRACE_QUEUE	0x4000
641
642#define PROFILE_TOSTAT	0x0001
643#define PROFILE_IMSG	0x0002
644#define PROFILE_QUEUE	0x0004
645
646struct forward_req {
647	uint64_t			id;
648	uint8_t				status;
649
650	char				user[SMTPD_VUSERNAME_SIZE];
651	uid_t				uid;
652	gid_t				gid;
653	char				directory[PATH_MAX];
654};
655
656struct deliver {
657	char			dispatcher[EXPAND_BUFFER];
658
659	struct mailaddr		sender;
660	struct mailaddr		rcpt;
661	struct mailaddr		dest;
662
663	char			mda_exec[LINE_MAX];
664
665	struct userinfo		userinfo;
666};
667
668struct mta_host {
669	SPLAY_ENTRY(mta_host)	 entry;
670	struct sockaddr		*sa;
671	char			*ptrname;
672	int			 refcount;
673	size_t			 nconn;
674	time_t			 lastconn;
675	time_t			 lastptrquery;
676
677#define HOST_IGNORE	0x01
678	int			 flags;
679};
680
681struct mta_mx {
682	TAILQ_ENTRY(mta_mx)	 entry;
683	struct mta_host		*host;
684	int			 preference;
685};
686
687struct mta_domain {
688	SPLAY_ENTRY(mta_domain)	 entry;
689	char			*name;
690	int			 as_host;
691	TAILQ_HEAD(, mta_mx)	 mxs;
692	int			 mxstatus;
693	int			 refcount;
694	size_t			 nconn;
695	time_t			 lastconn;
696	time_t			 lastmxquery;
697};
698
699struct mta_source {
700	SPLAY_ENTRY(mta_source)	 entry;
701	struct sockaddr		*sa;
702	int			 refcount;
703	size_t			 nconn;
704	time_t			 lastconn;
705};
706
707struct mta_connector {
708	struct mta_source		*source;
709	struct mta_relay		*relay;
710
711#define CONNECTOR_ERROR_FAMILY		0x0001
712#define CONNECTOR_ERROR_SOURCE		0x0002
713#define CONNECTOR_ERROR_MX		0x0004
714#define CONNECTOR_ERROR_ROUTE_NET	0x0008
715#define CONNECTOR_ERROR_ROUTE_SMTP	0x0010
716#define CONNECTOR_ERROR_ROUTE		0x0018
717#define CONNECTOR_ERROR_BLOCKED		0x0020
718#define CONNECTOR_ERROR			0x00ff
719
720#define CONNECTOR_LIMIT_HOST		0x0100
721#define CONNECTOR_LIMIT_ROUTE		0x0200
722#define CONNECTOR_LIMIT_SOURCE		0x0400
723#define CONNECTOR_LIMIT_RELAY		0x0800
724#define CONNECTOR_LIMIT_CONN		0x1000
725#define CONNECTOR_LIMIT_DOMAIN		0x2000
726#define CONNECTOR_LIMIT			0xff00
727
728#define CONNECTOR_NEW			0x10000
729#define CONNECTOR_WAIT			0x20000
730	int				 flags;
731
732	int				 refcount;
733	size_t				 nconn;
734	time_t				 lastconn;
735};
736
737struct mta_route {
738	SPLAY_ENTRY(mta_route)	 entry;
739	uint64_t		 id;
740	struct mta_source	*src;
741	struct mta_host		*dst;
742#define ROUTE_NEW		0x01
743#define ROUTE_RUNQ		0x02
744#define ROUTE_KEEPALIVE		0x04
745#define ROUTE_DISABLED		0xf0
746#define ROUTE_DISABLED_NET	0x10
747#define ROUTE_DISABLED_SMTP	0x20
748	int			 flags;
749	int			 nerror;
750	int			 penalty;
751	int			 refcount;
752	size_t			 nconn;
753	time_t			 lastconn;
754	time_t			 lastdisc;
755	time_t			 lastpenalty;
756};
757
758struct mta_limits {
759	size_t	maxconn_per_host;
760	size_t	maxconn_per_route;
761	size_t	maxconn_per_source;
762	size_t	maxconn_per_connector;
763	size_t	maxconn_per_relay;
764	size_t	maxconn_per_domain;
765
766	time_t	conndelay_host;
767	time_t	conndelay_route;
768	time_t	conndelay_source;
769	time_t	conndelay_connector;
770	time_t	conndelay_relay;
771	time_t	conndelay_domain;
772
773	time_t	discdelay_route;
774
775	size_t	max_mail_per_session;
776	time_t	sessdelay_transaction;
777	time_t	sessdelay_keepalive;
778
779	size_t	max_failures_per_session;
780
781	int	family;
782
783	int	task_hiwat;
784	int	task_lowat;
785	int	task_release;
786};
787
788struct mta_relay {
789	SPLAY_ENTRY(mta_relay)	 entry;
790	uint64_t		 id;
791
792	struct dispatcher	*dispatcher;
793	struct mta_domain	*domain;
794	struct mta_limits	*limits;
795	int			 tls;
796	int			 flags;
797	char			*backupname;
798	int			 backuppref;
799	char			*sourcetable;
800	uint16_t		 port;
801	char			*pki_name;
802	char			*ca_name;
803	char			*authtable;
804	char			*authlabel;
805	char			*helotable;
806	char			*heloname;
807	char			*secret;
808
809	int			 state;
810	size_t			 ntask;
811	TAILQ_HEAD(, mta_task)	 tasks;
812
813	struct tree		 connectors;
814	size_t			 sourceloop;
815	time_t			 lastsource;
816	time_t			 nextsource;
817
818	int			 fail;
819	char			*failstr;
820
821#define RELAY_WAIT_MX		0x01
822#define RELAY_WAIT_PREFERENCE	0x02
823#define RELAY_WAIT_SECRET	0x04
824#define RELAY_WAIT_LIMITS	0x08
825#define RELAY_WAIT_SOURCE	0x10
826#define RELAY_WAIT_CONNECTOR	0x20
827#define RELAY_WAIT_SMARTHOST	0x40
828#define RELAY_WAITMASK		0x7f
829	int			 status;
830
831	int			 refcount;
832	size_t			 nconn;
833	size_t			 nconn_ready;
834	time_t			 lastconn;
835};
836
837struct mta_envelope {
838	TAILQ_ENTRY(mta_envelope)	 entry;
839	uint64_t			 id;
840	uint64_t			 session;
841	time_t				 creation;
842	char				*smtpname;
843	char				*dest;
844	char				*rcpt;
845	struct mta_task			*task;
846	int				 delivery;
847
848	int				 ext;
849	char				*dsn_orcpt;
850	char				dsn_envid[DSN_ENVID_LEN+1];
851	uint8_t				dsn_notify;
852	enum dsn_ret			dsn_ret;
853
854	char				 status[LINE_MAX];
855};
856
857struct mta_task {
858	TAILQ_ENTRY(mta_task)		 entry;
859	struct mta_relay		*relay;
860	uint32_t			 msgid;
861	TAILQ_HEAD(, mta_envelope)	 envelopes;
862	char				*sender;
863};
864
865struct passwd;
866
867struct queue_backend {
868	int	(*init)(struct passwd *, int, const char *);
869};
870
871struct compress_backend {
872	size_t	(*compress_chunk)(void *, size_t, void *, size_t);
873	size_t	(*uncompress_chunk)(void *, size_t, void *, size_t);
874	int	(*compress_file)(FILE *, FILE *);
875	int	(*uncompress_file)(FILE *, FILE *);
876};
877
878/* auth structures */
879enum auth_type {
880	AUTH_BSD,
881	AUTH_PWD,
882};
883
884struct auth_backend {
885	int	(*authenticate)(char *, char *);
886};
887
888struct scheduler_backend {
889	int	(*init)(const char *);
890
891	int	(*insert)(struct scheduler_info *);
892	size_t	(*commit)(uint32_t);
893	size_t	(*rollback)(uint32_t);
894
895	int	(*update)(struct scheduler_info *);
896	int	(*delete)(uint64_t);
897	int	(*hold)(uint64_t, uint64_t);
898	int	(*release)(int, uint64_t, int);
899
900	int	(*batch)(int, int*, size_t*, uint64_t*, int*);
901
902	size_t	(*messages)(uint32_t, uint32_t *, size_t);
903	size_t	(*envelopes)(uint64_t, struct evpstate *, size_t);
904	int	(*schedule)(uint64_t);
905	int	(*remove)(uint64_t);
906	int	(*suspend)(uint64_t);
907	int	(*resume)(uint64_t);
908	int	(*query)(uint64_t);
909};
910
911enum stat_type {
912	STAT_COUNTER,
913	STAT_TIMESTAMP,
914	STAT_TIMEVAL,
915	STAT_TIMESPEC,
916};
917
918struct stat_value {
919	enum stat_type	type;
920	union stat_v {
921		size_t		counter;
922		time_t		timestamp;
923		struct timeval	tv;
924		struct timespec	ts;
925	} u;
926};
927
928#define	STAT_KEY_SIZE	1024
929struct stat_kv {
930	void	*iter;
931	char	key[STAT_KEY_SIZE];
932	struct stat_value	val;
933};
934
935struct stat_backend {
936	void	(*init)(void);
937	void	(*close)(void);
938	void	(*increment)(const char *, size_t);
939	void	(*decrement)(const char *, size_t);
940	void	(*set)(const char *, const struct stat_value *);
941	int	(*iter)(void **, char **, struct stat_value *);
942};
943
944struct stat_digest {
945	time_t			 startup;
946	time_t			 timestamp;
947
948	size_t			 clt_connect;
949	size_t			 clt_disconnect;
950
951	size_t			 evp_enqueued;
952	size_t			 evp_dequeued;
953
954	size_t			 evp_expired;
955	size_t			 evp_removed;
956	size_t			 evp_bounce;
957
958	size_t			 dlv_ok;
959	size_t			 dlv_permfail;
960	size_t			 dlv_tempfail;
961	size_t			 dlv_loop;
962};
963
964
965struct mproc {
966	pid_t		 pid;
967	char		*name;
968	int		 proc;
969	void		(*handler)(struct mproc *, struct imsg *);
970	struct imsgbuf	 imsgbuf;
971
972	char		*m_buf;
973	size_t		 m_alloc;
974	size_t		 m_pos;
975	uint32_t	 m_type;
976	uint32_t	 m_peerid;
977	pid_t		 m_pid;
978	int		 m_fd;
979
980	int		 enable;
981	short		 events;
982	struct event	 ev;
983	void		*data;
984};
985
986struct msg {
987	const uint8_t	*pos;
988	const uint8_t	*end;
989};
990
991extern enum smtp_proc_type	smtpd_process;
992
993extern int tracing;
994extern int foreground_log;
995extern int profiling;
996
997extern struct mproc *p_control;
998extern struct mproc *p_parent;
999extern struct mproc *p_lka;
1000extern struct mproc *p_queue;
1001extern struct mproc *p_scheduler;
1002extern struct mproc *p_pony;
1003extern struct mproc *p_ca;
1004
1005extern struct smtpd	*env;
1006extern void (*imsg_callback)(struct mproc *, struct imsg *);
1007
1008struct imsgproc {
1009	pid_t			pid;
1010	struct event		ev;
1011	struct imsgbuf	       *ibuf;
1012	char		       *path;
1013	char		       *name;
1014	void		      (*cb)(struct imsg *, void *);
1015	void		       *cb_arg;
1016};
1017
1018/* inter-process structures */
1019
1020struct bounce_req_msg {
1021	uint64_t		evpid;
1022	time_t			timestamp;
1023	struct delivery_bounce	bounce;
1024};
1025
1026enum dns_error {
1027	DNS_OK = 0,
1028	DNS_RETRY,
1029	DNS_EINVAL,
1030	DNS_ENONAME,
1031	DNS_ENOTFOUND,
1032};
1033
1034enum lka_resp_status {
1035	LKA_OK,
1036	LKA_TEMPFAIL,
1037	LKA_PERMFAIL
1038};
1039
1040struct processor {
1041	const char		       *command;
1042	const char		       *user;
1043	const char		       *group;
1044	const char		       *chroot;
1045};
1046
1047struct filter_rule {
1048	TAILQ_ENTRY(filter_rule)        entry;
1049
1050	enum filter_phase               phase;
1051	char                           *reject;
1052	char                           *disconnect;
1053	char                           *rewrite;
1054	char                           *proc;
1055
1056	int8_t                          not_table;
1057	struct table                   *table;
1058
1059	int8_t                          not_regex;
1060	struct table                   *regex;
1061
1062	int8_t				not_rdns;
1063	int8_t				rdns;
1064};
1065
1066enum filter_status {
1067	FILTER_PROCEED,
1068	FILTER_REWRITE,
1069	FILTER_REJECT,
1070	FILTER_DISCONNECT,
1071};
1072
1073enum ca_resp_status {
1074	CA_OK,
1075	CA_FAIL
1076};
1077
1078enum mda_resp_status {
1079	MDA_OK,
1080	MDA_TEMPFAIL,
1081	MDA_PERMFAIL
1082};
1083
1084struct ca_cert_req_msg {
1085	uint64_t		reqid;
1086	char			name[HOST_NAME_MAX+1];
1087	int			fallback;
1088};
1089
1090struct ca_cert_resp_msg {
1091	uint64_t		reqid;
1092	enum ca_resp_status	status;
1093	char			name[HOST_NAME_MAX+1];
1094	char		       *cert;
1095	off_t			cert_len;
1096};
1097
1098struct ca_vrfy_req_msg {
1099	uint64_t		reqid;
1100	char			name[HOST_NAME_MAX+1];
1101	int			fallback;
1102	unsigned char  	       *cert;
1103	off_t			cert_len;
1104	size_t			n_chain;
1105	size_t			chain_offset;
1106	unsigned char	      **chain_cert;
1107	off_t		       *chain_cert_len;
1108};
1109
1110struct ca_vrfy_resp_msg {
1111	uint64_t		reqid;
1112	enum ca_resp_status	status;
1113};
1114
1115struct msg_walkinfo {
1116	struct event	 ev;
1117	uint32_t	 msgid;
1118	uint32_t	 peerid;
1119	size_t		 n_evp;
1120	void		*data;
1121	int		 done;
1122};
1123
1124
1125enum dispatcher_type {
1126	DISPATCHER_LOCAL,
1127	DISPATCHER_REMOTE,
1128	DISPATCHER_BOUNCE,
1129};
1130
1131struct dispatcher_local {
1132	uint8_t requires_root;	/* only for MBOX */
1133
1134	uint8_t	expand_only;
1135	uint8_t	forward_only;
1136
1137	char	*mda_wrapper;
1138	char	*command;
1139
1140	char	*table_alias;
1141	char	*table_virtual;
1142	char	*table_userbase;
1143
1144	char	*user;
1145};
1146
1147struct dispatcher_remote {
1148	char	*helo;
1149	char	*helo_source;
1150
1151	char	*source;
1152
1153	char	*ca;
1154	char	*pki;
1155
1156	char	*mail_from;
1157
1158	char	*smarthost;
1159	char	*auth;
1160	int	 tls_required;
1161	int	 tls_noverify;
1162
1163	int	 backup;
1164	char	*backupmx;
1165};
1166
1167struct dispatcher_bounce {
1168};
1169
1170struct dispatcher {
1171	enum dispatcher_type			type;
1172	union dispatcher_agent {
1173		struct dispatcher_local		local;
1174		struct dispatcher_remote  	remote;
1175		struct dispatcher_bounce  	bounce;
1176	} u;
1177
1178	time_t	ttl;
1179};
1180
1181struct rule {
1182	TAILQ_ENTRY(rule)	r_entry;
1183
1184	uint8_t	reject;
1185
1186	int8_t	flag_tag;
1187	int8_t	flag_from;
1188	int8_t	flag_for;
1189	int8_t	flag_from_socket;
1190
1191	int8_t	flag_smtp_helo;
1192	int8_t	flag_smtp_starttls;
1193	int8_t	flag_smtp_auth;
1194	int8_t	flag_smtp_mail_from;
1195	int8_t	flag_smtp_rcpt_to;
1196
1197
1198	char	*table_tag;
1199	char	*table_from;
1200	char	*table_for;
1201
1202	char	*table_smtp_helo;
1203	char	*table_smtp_auth;
1204	char	*table_smtp_mail_from;
1205	char	*table_smtp_rcpt_to;
1206
1207	char	*dispatcher;
1208};
1209
1210
1211/* aliases.c */
1212int aliases_get(struct expand *, const char *);
1213int aliases_virtual_get(struct expand *, const struct mailaddr *);
1214int alias_parse(struct expandnode *, const char *);
1215
1216
1217/* auth.c */
1218struct auth_backend *auth_backend_lookup(enum auth_type);
1219
1220
1221/* bounce.c */
1222void bounce_add(uint64_t);
1223void bounce_fd(int);
1224
1225
1226/* ca.c */
1227int	 ca(void);
1228int	 ca_X509_verify(void *, void *, const char *, const char *, const char **);
1229void	 ca_imsg(struct mproc *, struct imsg *);
1230void	 ca_init(void);
1231void	 ca_engine_init(void);
1232
1233
1234/* cert.c */
1235int cert_init(const char *, int,
1236    void (*)(void *, int, const char *, const void *, size_t), void *);
1237int cert_verify(const void *, const char *, int, void (*)(void *, int), void *);
1238void cert_dispatch_request(struct mproc *, struct imsg *);
1239void cert_dispatch_result(struct mproc *, struct imsg *);
1240
1241
1242/* compress_backend.c */
1243struct compress_backend *compress_backend_lookup(const char *);
1244size_t	compress_chunk(void *, size_t, void *, size_t);
1245size_t	uncompress_chunk(void *, size_t, void *, size_t);
1246int	compress_file(FILE *, FILE *);
1247int	uncompress_file(FILE *, FILE *);
1248
1249/* config.c */
1250#define PURGE_LISTENERS		0x01
1251#define PURGE_TABLES		0x02
1252#define PURGE_RULES		0x04
1253#define PURGE_PKI		0x08
1254#define PURGE_PKI_KEYS		0x10
1255#define PURGE_DISPATCHERS	0x20
1256#define PURGE_EVERYTHING	0xff
1257struct smtpd *config_default(void);
1258void purge_config(uint8_t);
1259void config_process(enum smtp_proc_type);
1260void config_peer(enum smtp_proc_type);
1261
1262
1263/* control.c */
1264int control(void);
1265int control_create_socket(void);
1266
1267
1268/* crypto.c */
1269int	crypto_setup(const char *, size_t);
1270int	crypto_encrypt_file(FILE *, FILE *);
1271int	crypto_decrypt_file(FILE *, FILE *);
1272size_t	crypto_encrypt_buffer(const char *, size_t, char *, size_t);
1273size_t	crypto_decrypt_buffer(const char *, size_t, char *, size_t);
1274
1275
1276/* dns.c */
1277void dns_imsg(struct mproc *, struct imsg *);
1278
1279
1280/* enqueue.c */
1281int		 enqueue(int, char **, FILE *);
1282
1283
1284/* envelope.c */
1285void envelope_set_errormsg(struct envelope *, char *, ...);
1286void envelope_set_esc_class(struct envelope *, enum enhanced_status_class);
1287void envelope_set_esc_code(struct envelope *, enum enhanced_status_code);
1288int envelope_load_buffer(struct envelope *, const char *, size_t);
1289int envelope_dump_buffer(const struct envelope *, char *, size_t);
1290
1291
1292/* expand.c */
1293int expand_cmp(struct expandnode *, struct expandnode *);
1294void expand_insert(struct expand *, struct expandnode *);
1295struct expandnode *expand_lookup(struct expand *, struct expandnode *);
1296void expand_clear(struct expand *);
1297void expand_free(struct expand *);
1298int expand_line(struct expand *, const char *, int);
1299int expand_to_text(struct expand *, char *, size_t);
1300RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp);
1301
1302
1303/* forward.c */
1304int forwards_get(int, struct expand *);
1305
1306
1307/* imsgproc.c */
1308void imsgproc_init(void);
1309struct imsgproc *imsgproc_fork(const char *, const char *,
1310    void (*)(struct imsg *, void *), void *);
1311void imsgproc_set_read(struct imsgproc *);
1312void imsgproc_set_write(struct imsgproc *);
1313void imsgproc_set_read_write(struct imsgproc *);
1314void imsgproc_reset_callback(struct imsgproc *, void (*)(struct imsg *, void *), void *);
1315
1316
1317/* limit.c */
1318void limit_mta_set_defaults(struct mta_limits *);
1319int limit_mta_set(struct mta_limits *, const char*, int64_t);
1320
1321
1322/* lka.c */
1323int lka(void);
1324
1325
1326/* lka_proc.c */
1327void lka_proc_forked(const char *, int);
1328struct io *lka_proc_get_io(const char *);
1329
1330
1331/* lka_report.c */
1332void lka_report_smtp_link_connect(const char *, time_t, uint64_t, const char *, int,
1333    const struct sockaddr_storage *, const struct sockaddr_storage *);
1334void lka_report_smtp_link_disconnect(const char *, time_t, uint64_t);
1335void lka_report_smtp_link_tls(const char *, time_t, uint64_t, const char *);
1336void lka_report_smtp_tx_begin(const char *, time_t, uint64_t, uint32_t);
1337void lka_report_smtp_tx_mail(const char *, time_t, uint64_t, uint32_t, const char *, int);
1338void lka_report_smtp_tx_rcpt(const char *, time_t, uint64_t, uint32_t, const char *, int);
1339void lka_report_smtp_tx_envelope(const char *, time_t, uint64_t, uint32_t, uint64_t);
1340void lka_report_smtp_tx_commit(const char *, time_t, uint64_t, uint32_t, size_t);
1341void lka_report_smtp_tx_rollback(const char *, time_t, uint64_t, uint32_t);
1342void lka_report_smtp_protocol_client(const char *, time_t, uint64_t, const char *);
1343void lka_report_smtp_protocol_server(const char *, time_t, uint64_t, const char *);
1344
1345
1346/* lka_filter.c */
1347void lka_filter_begin(uint64_t, const struct sockaddr_storage *, const struct sockaddr_storage *, const char *, int);
1348void lka_filter_end(uint64_t);
1349void lka_filter_protocol(uint64_t, enum filter_phase, const char *);
1350void lka_filter_data_begin(uint64_t);
1351void lka_filter_data_end(uint64_t);
1352int lka_filter_response(uint64_t, const char *, const char *);
1353
1354
1355/* lka_session.c */
1356void lka_session(uint64_t, struct envelope *);
1357void lka_session_forward_reply(struct forward_req *, int);
1358
1359
1360/* log.c */
1361void vlog(int, const char *, va_list);
1362void logit(int, const char *, ...) __attribute__((format (printf, 2, 3)));
1363
1364
1365/* mda.c */
1366void mda_postfork(void);
1367void mda_postprivdrop(void);
1368void mda_imsg(struct mproc *, struct imsg *);
1369
1370
1371/* mda_unpriv.c */
1372void mda_unpriv(struct dispatcher *, struct deliver *, const char *, const char *);
1373
1374
1375/* mda_variables.c */
1376ssize_t mda_expand_format(char *, size_t, const struct deliver *,
1377    const struct userinfo *, const char *);
1378
1379
1380/* makemap.c */
1381int makemap(int, int, char **);
1382
1383
1384/* mailaddr.c */
1385int mailaddr_line(struct maddrmap *, const char *);
1386void maddrmap_init(struct maddrmap *);
1387void maddrmap_insert(struct maddrmap *, struct maddrnode *);
1388void maddrmap_free(struct maddrmap *);
1389
1390
1391/* mproc.c */
1392int mproc_fork(struct mproc *, const char*, char **);
1393void mproc_init(struct mproc *, int);
1394void mproc_clear(struct mproc *);
1395void mproc_enable(struct mproc *);
1396void mproc_disable(struct mproc *);
1397void mproc_event_add(struct mproc *);
1398void m_compose(struct mproc *, uint32_t, uint32_t, pid_t, int, void *, size_t);
1399void m_composev(struct mproc *, uint32_t, uint32_t, pid_t, int,
1400    const struct iovec *, int);
1401void m_forward(struct mproc *, struct imsg *);
1402void m_create(struct mproc *, uint32_t, uint32_t, pid_t, int);
1403void m_add(struct mproc *, const void *, size_t);
1404void m_add_int(struct mproc *, int);
1405void m_add_u32(struct mproc *, uint32_t);
1406void m_add_size(struct mproc *, size_t);
1407void m_add_time(struct mproc *, time_t);
1408void m_add_string(struct mproc *, const char *);
1409void m_add_data(struct mproc *, const void *, size_t);
1410void m_add_evpid(struct mproc *, uint64_t);
1411void m_add_msgid(struct mproc *, uint32_t);
1412void m_add_id(struct mproc *, uint64_t);
1413void m_add_sockaddr(struct mproc *, const struct sockaddr *);
1414void m_add_mailaddr(struct mproc *, const struct mailaddr *);
1415void m_add_envelope(struct mproc *, const struct envelope *);
1416void m_add_params(struct mproc *, struct dict *);
1417void m_close(struct mproc *);
1418void m_flush(struct mproc *);
1419
1420void m_msg(struct msg *, struct imsg *);
1421int  m_is_eom(struct msg *);
1422void m_end(struct msg *);
1423void m_get_int(struct msg *, int *);
1424void m_get_size(struct msg *, size_t *);
1425void m_get_u32(struct msg *, uint32_t *);
1426void m_get_time(struct msg *, time_t *);
1427void m_get_string(struct msg *, const char **);
1428void m_get_data(struct msg *, const void **, size_t *);
1429void m_get_evpid(struct msg *, uint64_t *);
1430void m_get_msgid(struct msg *, uint32_t *);
1431void m_get_id(struct msg *, uint64_t *);
1432void m_get_sockaddr(struct msg *, struct sockaddr *);
1433void m_get_mailaddr(struct msg *, struct mailaddr *);
1434void m_get_envelope(struct msg *, struct envelope *);
1435void m_get_params(struct msg *, struct dict *);
1436void m_clear_params(struct dict *);
1437
1438
1439/* mta.c */
1440void mta_postfork(void);
1441void mta_postprivdrop(void);
1442void mta_imsg(struct mproc *, struct imsg *);
1443void mta_route_ok(struct mta_relay *, struct mta_route *);
1444void mta_route_error(struct mta_relay *, struct mta_route *);
1445void mta_route_down(struct mta_relay *, struct mta_route *);
1446void mta_route_collect(struct mta_relay *, struct mta_route *);
1447void mta_source_error(struct mta_relay *, struct mta_route *, const char *);
1448void mta_delivery_log(struct mta_envelope *, const char *, const char *, int, const char *);
1449void mta_delivery_notify(struct mta_envelope *);
1450struct mta_task *mta_route_next_task(struct mta_relay *, struct mta_route *);
1451const char *mta_host_to_text(struct mta_host *);
1452const char *mta_relay_to_text(struct mta_relay *);
1453
1454
1455/* mta_report.c */
1456void mta_report_link_connect(uint64_t, const char *, int,
1457    const struct sockaddr_storage *, const struct sockaddr_storage *);
1458void mta_report_link_disconnect(uint64_t);
1459void mta_report_link_tls(uint64_t, const char *);
1460void mta_report_tx_begin(uint64_t, uint32_t);
1461void mta_report_tx_mail(uint64_t, uint32_t, const char *, int);
1462void mta_report_tx_rcpt(uint64_t, uint32_t, const char *, int);
1463void mta_report_tx_envelope(uint64_t, uint32_t, uint64_t);
1464void mta_report_tx_commit(uint64_t, uint32_t, size_t);
1465void mta_report_tx_rollback(uint64_t, uint32_t);
1466void mta_report_protocol_client(uint64_t, const char *);
1467void mta_report_protocol_server(uint64_t, const char *);
1468
1469
1470/* mta_session.c */
1471void mta_session(struct mta_relay *, struct mta_route *);
1472void mta_session_imsg(struct mproc *, struct imsg *);
1473
1474
1475/* parse.y */
1476int parse_config(struct smtpd *, const char *, int);
1477int cmdline_symset(char *);
1478
1479
1480/* queue.c */
1481int queue(void);
1482
1483
1484/* queue_backend.c */
1485uint32_t queue_generate_msgid(void);
1486uint64_t queue_generate_evpid(uint32_t);
1487int queue_init(const char *, int);
1488int queue_close(void);
1489int queue_message_create(uint32_t *);
1490int queue_message_delete(uint32_t);
1491int queue_message_commit(uint32_t);
1492int queue_message_fd_r(uint32_t);
1493int queue_message_fd_rw(uint32_t);
1494int queue_envelope_create(struct envelope *);
1495int queue_envelope_delete(uint64_t);
1496int queue_envelope_load(uint64_t, struct envelope *);
1497int queue_envelope_update(struct envelope *);
1498int queue_envelope_walk(struct envelope *);
1499int queue_message_walk(struct envelope *, uint32_t, int *, void **);
1500
1501
1502/* ruleset.c */
1503struct rule *ruleset_match(const struct envelope *);
1504
1505
1506/* scheduler.c */
1507int scheduler(void);
1508
1509
1510/* scheduler_bakend.c */
1511struct scheduler_backend *scheduler_backend_lookup(const char *);
1512void scheduler_info(struct scheduler_info *, struct envelope *);
1513
1514
1515/* pony.c */
1516int pony(void);
1517void pony_imsg(struct mproc *, struct imsg *);
1518
1519
1520/* resolver.c */
1521void resolver_getaddrinfo(const char *, const char *, const struct addrinfo *,
1522    void(*)(void *, int, struct addrinfo*), void *);
1523void resolver_getnameinfo(const struct sockaddr *, int,
1524    void(*)(void *, int, const char *, const char *), void *);
1525void resolver_dispatch_request(struct mproc *, struct imsg *);
1526void resolver_dispatch_result(struct mproc *, struct imsg *);
1527
1528
1529/* smtp.c */
1530void smtp_postfork(void);
1531void smtp_postprivdrop(void);
1532void smtp_imsg(struct mproc *, struct imsg *);
1533void smtp_configure(void);
1534void smtp_collect(void);
1535
1536
1537/* smtp_report.c */
1538void smtp_report_link_connect(uint64_t, const char *, int,
1539    const struct sockaddr_storage *, const struct sockaddr_storage *);
1540void smtp_report_link_disconnect(uint64_t);
1541void smtp_report_link_tls(uint64_t, const char *);
1542void smtp_report_tx_begin(uint64_t, uint32_t);
1543void smtp_report_tx_mail(uint64_t, uint32_t, const char *, int);
1544void smtp_report_tx_rcpt(uint64_t, uint32_t, const char *, int);
1545void smtp_report_tx_envelope(uint64_t, uint32_t, uint64_t);
1546void smtp_report_tx_commit(uint64_t, uint32_t, size_t);
1547void smtp_report_tx_rollback(uint64_t, uint32_t);
1548void smtp_report_protocol_client(uint64_t, const char *);
1549void smtp_report_protocol_server(uint64_t, const char *);
1550
1551
1552/* smtp_session.c */
1553int smtp_session(struct listener *, int, const struct sockaddr_storage *,
1554    const char *, struct io *);
1555void smtp_session_imsg(struct mproc *, struct imsg *);
1556
1557
1558/* smtpf_session.c */
1559int smtpf_session(struct listener *, int, const struct sockaddr_storage *,
1560    const char *);
1561void smtpf_session_imsg(struct mproc *, struct imsg *);
1562
1563
1564/* smtpd.c */
1565void imsg_dispatch(struct mproc *, struct imsg *);
1566const char *proc_name(enum smtp_proc_type);
1567const char *proc_title(enum smtp_proc_type);
1568const char *imsg_to_str(int);
1569void log_imsg(int, int, struct imsg *);
1570int fork_proc_backend(const char *, const char *, const char *);
1571
1572
1573/* ssl_smtpd.c */
1574void   *ssl_mta_init(void *, char *, off_t, const char *);
1575void   *ssl_smtp_init(void *, int);
1576
1577
1578/* stat_backend.c */
1579struct stat_backend	*stat_backend_lookup(const char *);
1580void	stat_increment(const char *, size_t);
1581void	stat_decrement(const char *, size_t);
1582void	stat_set(const char *, const struct stat_value *);
1583struct stat_value *stat_counter(size_t);
1584struct stat_value *stat_timestamp(time_t);
1585struct stat_value *stat_timeval(struct timeval *);
1586struct stat_value *stat_timespec(struct timespec *);
1587
1588
1589/* table.c */
1590struct table *table_find(struct smtpd *, const char *, const char *);
1591struct table *table_create(struct smtpd *, const char *, const char *, const char *,
1592    const char *);
1593int	table_config(struct table *);
1594int	table_open(struct table *);
1595int	table_update(struct table *);
1596void	table_close(struct table *);
1597int	table_check_use(struct table *, uint32_t, uint32_t);
1598int	table_check_type(struct table *, uint32_t);
1599int	table_check_service(struct table *, uint32_t);
1600int	table_lookup(struct table *, struct dict *, const char *, enum table_service,
1601    union lookup *);
1602int	table_fetch(struct table *, struct dict *, enum table_service, union lookup *);
1603void table_destroy(struct smtpd *, struct table *);
1604void table_add(struct table *, const char *, const char *);
1605int table_domain_match(const char *, const char *);
1606int table_netaddr_match(const char *, const char *);
1607int table_mailaddr_match(const char *, const char *);
1608int table_regex_match(const char *, const char *);
1609void	table_open_all(struct smtpd *);
1610void	table_dump_all(struct smtpd *);
1611void	table_close_all(struct smtpd *);
1612int table_parse_lookup(enum table_service, const char *, const char *,
1613    union lookup *);
1614
1615
1616/* to.c */
1617int email_to_mailaddr(struct mailaddr *, char *);
1618int text_to_netaddr(struct netaddr *, const char *);
1619int text_to_mailaddr(struct mailaddr *, const char *);
1620int text_to_relayhost(struct relayhost *, const char *);
1621int text_to_userinfo(struct userinfo *, const char *);
1622int text_to_credentials(struct credentials *, const char *);
1623int text_to_expandnode(struct expandnode *, const char *);
1624uint64_t text_to_evpid(const char *);
1625uint32_t text_to_msgid(const char *);
1626const char *sa_to_text(const struct sockaddr *);
1627const char *ss_to_text(const struct sockaddr_storage *);
1628const char *time_to_text(time_t);
1629const char *duration_to_text(time_t);
1630const char *rule_to_text(struct rule *);
1631const char *sockaddr_to_text(struct sockaddr *);
1632const char *mailaddr_to_text(const struct mailaddr *);
1633const char *expandnode_to_text(struct expandnode *);
1634
1635
1636/* util.c */
1637typedef struct arglist arglist;
1638struct arglist {
1639	char	**list;
1640	uint	  num;
1641	uint	  nalloc;
1642};
1643void addargs(arglist *, char *, ...)
1644	__attribute__((format(printf, 2, 3)));
1645int bsnprintf(char *, size_t, const char *, ...)
1646	__attribute__((format (printf, 3, 4)));
1647int mkdirs(char *, mode_t);
1648int safe_fclose(FILE *);
1649int hostname_match(const char *, const char *);
1650int mailaddr_match(const struct mailaddr *, const struct mailaddr *);
1651int valid_localpart(const char *);
1652int valid_domainpart(const char *);
1653int valid_smtp_response(const char *);
1654int secure_file(int, char *, char *, uid_t, int);
1655int  lowercase(char *, const char *, size_t);
1656void xlowercase(char *, const char *, size_t);
1657int  uppercase(char *, const char *, size_t);
1658uint64_t generate_uid(void);
1659int availdesc(void);
1660int ckdir(const char *, mode_t, uid_t, gid_t, int);
1661int rmtree(char *, int);
1662int mvpurge(char *, char *);
1663int mktmpfile(void);
1664const char *parse_smtp_response(char *, size_t, char **, int *);
1665int xasprintf(char **, const char *, ...);
1666void *xmalloc(size_t);
1667void *xcalloc(size_t, size_t);
1668char *xstrdup(const char *);
1669void *xmemdup(const void *, size_t);
1670char *strip(char *);
1671int io_xprint(struct io *, const char *);
1672int io_xprintf(struct io *, const char *, ...);
1673void log_envelope(const struct envelope *, const char *, const char *,
1674    const char *);
1675int session_socket_error(int);
1676int getmailname(char *, size_t);
1677int base64_encode(unsigned char const *, size_t, char *, size_t);
1678int base64_decode(char const *, unsigned char *, size_t);
1679
1680void log_trace_verbose(int);
1681void log_trace(int, const char *, ...)
1682    __attribute__((format (printf, 2, 3)));
1683
1684/* waitq.c */
1685int  waitq_wait(void *, void (*)(void *, void *, void *), void *);
1686void waitq_run(void *, void *);
1687
1688
1689/* runq.c */
1690struct runq;
1691
1692int runq_init(struct runq **, void (*)(struct runq *, void *));
1693int runq_schedule(struct runq *, time_t, void (*)(struct runq *, void *), void *);
1694int runq_delay(struct runq *, unsigned int, void (*)(struct runq *, void *), void *);
1695int runq_cancel(struct runq *, void (*)(struct runq *, void *), void *);
1696int runq_pending(struct runq *, void (*)(struct runq *, void *), void *, time_t *);
1697int runq_next(struct runq *, void (**)(struct runq *, void *), void **, time_t *);
1698