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