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