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