1 /*++
2 /* NAME
3 /*	mail_server 3h
4 /* SUMMARY
5 /*	skeleton servers
6 /* SYNOPSIS
7 /*	#include <mail_server.h>
8 /* DESCRIPTION
9 /* .nf
10 
11  /*
12   * Utility library.
13   */
14 #include <vstream.h>
15 #include <htable.h>
16 
17  /*
18   * Global library.
19   */
20 #include <mail_conf.h>
21 
22  /*
23   * External interface. Tables are defined in mail_conf.h.
24   */
25 #define MAIL_SERVER_INT_TABLE	1
26 #define MAIL_SERVER_STR_TABLE	2
27 #define MAIL_SERVER_BOOL_TABLE	3
28 #define MAIL_SERVER_TIME_TABLE	4
29 #define MAIL_SERVER_RAW_TABLE	5
30 #define MAIL_SERVER_NINT_TABLE	6
31 #define MAIL_SERVER_NBOOL_TABLE	7
32 #define MAIL_SERVER_LONG_TABLE	8
33 
34 #define	MAIL_SERVER_PRE_INIT	10
35 #define MAIL_SERVER_POST_INIT	11
36 #define MAIL_SERVER_LOOP	12
37 #define MAIL_SERVER_EXIT	13
38 #define MAIL_SERVER_PRE_ACCEPT	14
39 #define MAIL_SERVER_SOLITARY	15
40 #define MAIL_SERVER_UNLIMITED	16
41 #define MAIL_SERVER_PRE_DISCONN	17
42 #define MAIL_SERVER_PRIVILEGED	18
43 #define MAIL_SERVER_WATCHDOG	19
44 
45 #define MAIL_SERVER_IN_FLOW_DELAY	20
46 #define MAIL_SERVER_SLOW_EXIT	21
47 #define MAIL_SERVER_BOUNCE_INIT	22
48 #define MAIL_SERVER_RETIRE_ME	23
49 #define MAIL_SERVER_POST_ACCEPT	24
50 
51 typedef void (*MAIL_SERVER_INIT_FN) (char *, char **);
52 typedef int (*MAIL_SERVER_LOOP_FN) (char *, char **);
53 typedef void (*MAIL_SERVER_EXIT_FN) (char *, char **);
54 typedef void (*MAIL_SERVER_ACCEPT_FN) (char *, char **);
55 typedef void (*MAIL_SERVER_POST_ACCEPT_FN) (VSTREAM *, char *, char **, HTABLE *);
56 typedef void (*MAIL_SERVER_DISCONN_FN) (VSTREAM *, char *, char **);
57 typedef void (*MAIL_SERVER_SLOW_EXIT_FN) (char *, char **);
58 
59 /* Type-checked API for external use. */
60 #define CA_MAIL_SERVER_INT_TABLE(v)	MAIL_SERVER_INT_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_INT_TABLE, (v))
61 #define CA_MAIL_SERVER_STR_TABLE(v)	MAIL_SERVER_STR_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_STR_TABLE, (v))
62 #define CA_MAIL_SERVER_BOOL_TABLE(v)	MAIL_SERVER_BOOL_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_BOOL_TABLE, (v))
63 #define CA_MAIL_SERVER_TIME_TABLE(v)	MAIL_SERVER_TIME_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_TIME_TABLE, (v))
64 #define CA_MAIL_SERVER_RAW_TABLE(v)	MAIL_SERVER_RAW_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_RAW_TABLE, (v))
65 #define CA_MAIL_SERVER_NINT_TABLE(v)	MAIL_SERVER_NINT_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_NINT_TABLE, (v))
66 #define CA_MAIL_SERVER_NBOOL_TABLE(v)	MAIL_SERVER_NBOOL_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_NBOOL_TABLE, (v))
67 #define CA_MAIL_SERVER_LONG_TABLE(v)	MAIL_SERVER_LONG_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_LONG_TABLE, (v))
68 #define CA_MAIL_SERVER_PRE_INIT(v)	MAIL_SERVER_PRE_INIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_INIT_FN, (v))
69 #define CA_MAIL_SERVER_POST_INIT(v)	MAIL_SERVER_POST_INIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_INIT_FN, (v))
70 #define CA_MAIL_SERVER_LOOP(v)		MAIL_SERVER_LOOP, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_LOOP_FN, (v))
71 #define CA_MAIL_SERVER_EXIT(v)		MAIL_SERVER_EXIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_EXIT_FN, (v))
72 #define CA_MAIL_SERVER_PRE_ACCEPT(v)	MAIL_SERVER_PRE_ACCEPT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_ACCEPT_FN, (v))
73 #define CA_MAIL_SERVER_POST_ACCEPT(v)	MAIL_SERVER_POST_ACCEPT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_POST_ACCEPT_FN, (v))
74 #define CA_MAIL_SERVER_SOLITARY	MAIL_SERVER_SOLITARY
75 #define CA_MAIL_SERVER_UNLIMITED	MAIL_SERVER_UNLIMITED
76 #define CA_MAIL_SERVER_PRE_DISCONN(v)	MAIL_SERVER_PRE_DISCONN, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_DISCONN_FN, (v))
77 #define CA_MAIL_SERVER_PRIVILEGED	MAIL_SERVER_PRIVILEGED
78 #define CA_MAIL_SERVER_WATCHDOG(v)	MAIL_SERVER_WATCHDOG, CHECK_PTR(MAIL_SERVER, int, (v))
79 #define CA_MAIL_SERVER_IN_FLOW_DELAY	MAIL_SERVER_IN_FLOW_DELAY
80 #define CA_MAIL_SERVER_SLOW_EXIT(v)	MAIL_SERVER_SLOW_EXIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_SLOW_EXIT_FN, (v))
81 #define CA_MAIL_SERVER_BOUNCE_INIT(v, w) MAIL_SERVER_BOUNCE_INIT, CHECK_PTR(MAIL_SERVER, char, (v)), CHECK_PPTR(MAIL_SERVER, char, (w))
82 #define CA_MAIL_SERVER_RETIRE_ME	MAIL_SERVER_RETIRE_ME
83 
84 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_SLOW_EXIT_FN);
85 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_LOOP_FN);
86 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_INIT_FN);
87 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_EXIT_FN);
88 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_DISCONN_FN);
89 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_ACCEPT_FN);
90 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_POST_ACCEPT_FN);
91 CHECK_PTR_HELPER_DCL(MAIL_SERVER, int);
92 CHECK_PTR_HELPER_DCL(MAIL_SERVER, char);
93 CHECK_PPTR_HELPER_DCL(MAIL_SERVER, char);
94 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_TIME_TABLE);
95 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_STR_TABLE);
96 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_RAW_TABLE);
97 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_NINT_TABLE);
98 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_NBOOL_TABLE);
99 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_LONG_TABLE);
100 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_INT_TABLE);
101 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_BOOL_TABLE);
102 
103  /*
104   * single_server.c
105   */
106 typedef void (*SINGLE_SERVER_FN) (VSTREAM *, char *, char **);
107 extern NORETURN single_server_main(int, char **, SINGLE_SERVER_FN,...);
108 
109  /*
110   * multi_server.c
111   */
112 typedef void (*MULTI_SERVER_FN) (VSTREAM *, char *, char **);
113 extern NORETURN multi_server_main(int, char **, MULTI_SERVER_FN,...);
114 extern void multi_server_disconnect(VSTREAM *);
115 extern int multi_server_drain(void);
116 
117  /*
118   * event_server.c
119   */
120 typedef void (*EVENT_SERVER_FN) (VSTREAM *, char *, char **);
121 extern NORETURN event_server_main(int, char **, EVENT_SERVER_FN,...);
122 extern void event_server_disconnect(VSTREAM *);
123 extern int event_server_drain(void);
124 
125  /*
126   * trigger_server.c
127   */
128 typedef void (*TRIGGER_SERVER_FN) (char *, ssize_t, char *, char **);
129 extern NORETURN trigger_server_main(int, char **, TRIGGER_SERVER_FN,...);
130 
131 #define TRIGGER_BUF_SIZE	1024
132 
133  /*
134   * dgram_server.c
135   */
136 typedef void (*DGRAM_SERVER_FN) (char *, ssize_t, char *, char **);
137 extern NORETURN dgram_server_main(int, char **, DGRAM_SERVER_FN,...);
138 
139 #define DGRAM_BUF_SIZE	4096
140 
141 /* LICENSE
142 /* .ad
143 /* .fi
144 /*	The Secure Mailer license must be distributed with this software.
145 /* AUTHOR(S)
146 /*	Wietse Venema
147 /*	IBM T.J. Watson Research
148 /*	P.O. Box 704
149 /*	Yorktown Heights, NY 10598, USA
150 /*
151 /*	Wietse Venema
152 /*	Google, Inc.
153 /*	111 8th Avenue
154 /*	New York, NY 10011, USA
155 /*--*/
156