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