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