1 /*        $NetBSD: mail_server.h,v 1.5 2025/02/25 19:15:46 christos Exp $       */
2 
3 /*++
4 /* NAME
5 /*        mail_server 3h
6 /* SUMMARY
7 /*        skeleton servers
8 /* SYNOPSIS
9 /*        #include <mail_server.h>
10 /* DESCRIPTION
11 /* .nf
12 
13  /*
14   * Utility library.
15   */
16 #include <vstream.h>
17 #include <htable.h>
18 
19  /*
20   * Global library.
21   */
22 #include <mail_conf.h>
23 
24  /*
25   * External interface. Tables are defined in mail_conf.h.
26   */
27 #define MAIL_SERVER_INT_TABLE 1
28 #define MAIL_SERVER_STR_TABLE 2
29 #define MAIL_SERVER_BOOL_TABLE          3
30 #define MAIL_SERVER_TIME_TABLE          4
31 #define MAIL_SERVER_RAW_TABLE 5
32 #define MAIL_SERVER_NINT_TABLE          6
33 #define MAIL_SERVER_NBOOL_TABLE         7
34 #define MAIL_SERVER_LONG_TABLE          8
35 
36 #define   MAIL_SERVER_PRE_INIT          10
37 #define MAIL_SERVER_POST_INIT 11
38 #define MAIL_SERVER_LOOP      12
39 #define MAIL_SERVER_EXIT      13
40 #define MAIL_SERVER_PRE_ACCEPT          14
41 #define MAIL_SERVER_SOLITARY  15
42 #define MAIL_SERVER_UNLIMITED 16
43 #define MAIL_SERVER_PRE_DISCONN         17
44 #define MAIL_SERVER_PRIVILEGED          18
45 #define MAIL_SERVER_WATCHDOG  19
46 
47 #define MAIL_SERVER_IN_FLOW_DELAY       20
48 #define MAIL_SERVER_SLOW_EXIT 21
49 #define MAIL_SERVER_BOUNCE_INIT         22
50 #define MAIL_SERVER_RETIRE_ME 23
51 #define MAIL_SERVER_POST_ACCEPT         24
52 
53 typedef void (*MAIL_SERVER_INIT_FN) (char *, char **);
54 typedef int (*MAIL_SERVER_LOOP_FN) (char *, char **);
55 typedef void (*MAIL_SERVER_EXIT_FN) (char *, char **);
56 typedef void (*MAIL_SERVER_ACCEPT_FN) (char *, char **);
57 typedef void (*MAIL_SERVER_POST_ACCEPT_FN) (VSTREAM *, char *, char **, HTABLE *);
58 typedef void (*MAIL_SERVER_DISCONN_FN) (VSTREAM *, char *, char **);
59 typedef void (*MAIL_SERVER_SLOW_EXIT_FN) (char *, char **);
60 
61 /* Type-checked API for external use. */
62 #define CA_MAIL_SERVER_INT_TABLE(v)     MAIL_SERVER_INT_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_INT_TABLE, (v))
63 #define CA_MAIL_SERVER_STR_TABLE(v)     MAIL_SERVER_STR_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_STR_TABLE, (v))
64 #define CA_MAIL_SERVER_BOOL_TABLE(v)    MAIL_SERVER_BOOL_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_BOOL_TABLE, (v))
65 #define CA_MAIL_SERVER_TIME_TABLE(v)    MAIL_SERVER_TIME_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_TIME_TABLE, (v))
66 #define CA_MAIL_SERVER_RAW_TABLE(v)     MAIL_SERVER_RAW_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_RAW_TABLE, (v))
67 #define CA_MAIL_SERVER_NINT_TABLE(v)    MAIL_SERVER_NINT_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_NINT_TABLE, (v))
68 #define CA_MAIL_SERVER_NBOOL_TABLE(v)   MAIL_SERVER_NBOOL_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_NBOOL_TABLE, (v))
69 #define CA_MAIL_SERVER_LONG_TABLE(v)    MAIL_SERVER_LONG_TABLE, CHECK_CPTR(MAIL_SERVER, CONFIG_LONG_TABLE, (v))
70 #define CA_MAIL_SERVER_PRE_INIT(v)      MAIL_SERVER_PRE_INIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_INIT_FN, (v))
71 #define CA_MAIL_SERVER_POST_INIT(v)     MAIL_SERVER_POST_INIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_INIT_FN, (v))
72 #define CA_MAIL_SERVER_LOOP(v)                    MAIL_SERVER_LOOP, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_LOOP_FN, (v))
73 #define CA_MAIL_SERVER_EXIT(v)                    MAIL_SERVER_EXIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_EXIT_FN, (v))
74 #define CA_MAIL_SERVER_PRE_ACCEPT(v)    MAIL_SERVER_PRE_ACCEPT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_ACCEPT_FN, (v))
75 #define CA_MAIL_SERVER_POST_ACCEPT(v)   MAIL_SERVER_POST_ACCEPT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_POST_ACCEPT_FN, (v))
76 #define CA_MAIL_SERVER_SOLITARY         MAIL_SERVER_SOLITARY
77 #define CA_MAIL_SERVER_UNLIMITED        MAIL_SERVER_UNLIMITED
78 #define CA_MAIL_SERVER_PRE_DISCONN(v)   MAIL_SERVER_PRE_DISCONN, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_DISCONN_FN, (v))
79 #define CA_MAIL_SERVER_PRIVILEGED       MAIL_SERVER_PRIVILEGED
80 #define CA_MAIL_SERVER_WATCHDOG(v)      MAIL_SERVER_WATCHDOG, CHECK_PTR(MAIL_SERVER, int, (v))
81 #define CA_MAIL_SERVER_IN_FLOW_DELAY    MAIL_SERVER_IN_FLOW_DELAY
82 #define CA_MAIL_SERVER_SLOW_EXIT(v)     MAIL_SERVER_SLOW_EXIT, CHECK_VAL(MAIL_SERVER, MAIL_SERVER_SLOW_EXIT_FN, (v))
83 #define CA_MAIL_SERVER_BOUNCE_INIT(v, w) MAIL_SERVER_BOUNCE_INIT, CHECK_PTR(MAIL_SERVER, char, (v)), CHECK_PPTR(MAIL_SERVER, char, (w))
84 #define CA_MAIL_SERVER_RETIRE_ME        MAIL_SERVER_RETIRE_ME
85 
86 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_SLOW_EXIT_FN);
87 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_LOOP_FN);
88 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_INIT_FN);
89 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_EXIT_FN);
90 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_DISCONN_FN);
91 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_ACCEPT_FN);
92 CHECK_VAL_HELPER_DCL(MAIL_SERVER, MAIL_SERVER_POST_ACCEPT_FN);
93 CHECK_PTR_HELPER_DCL(MAIL_SERVER, int);
94 CHECK_PTR_HELPER_DCL(MAIL_SERVER, char);
95 CHECK_PPTR_HELPER_DCL(MAIL_SERVER, char);
96 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_TIME_TABLE);
97 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_STR_TABLE);
98 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_RAW_TABLE);
99 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_NINT_TABLE);
100 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_NBOOL_TABLE);
101 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_LONG_TABLE);
102 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_INT_TABLE);
103 CHECK_CPTR_HELPER_DCL(MAIL_SERVER, CONFIG_BOOL_TABLE);
104 
105  /*
106   * single_server.c
107   */
108 typedef void (*SINGLE_SERVER_FN) (VSTREAM *, char *, char **);
109 extern NORETURN single_server_main(int, char **, SINGLE_SERVER_FN,...);
110 
111  /*
112   * multi_server.c
113   */
114 typedef void (*MULTI_SERVER_FN) (VSTREAM *, char *, char **);
115 extern NORETURN multi_server_main(int, char **, MULTI_SERVER_FN,...);
116 extern void multi_server_disconnect(VSTREAM *);
117 extern int multi_server_drain(void);
118 
119  /*
120   * event_server.c
121   */
122 typedef void (*EVENT_SERVER_FN) (VSTREAM *, char *, char **);
123 extern NORETURN event_server_main(int, char **, EVENT_SERVER_FN,...);
124 extern void event_server_disconnect(VSTREAM *);
125 extern int event_server_drain(void);
126 
127  /*
128   * trigger_server.c
129   */
130 typedef void (*TRIGGER_SERVER_FN) (char *, ssize_t, char *, char **);
131 extern NORETURN trigger_server_main(int, char **, TRIGGER_SERVER_FN,...);
132 
133 #define TRIGGER_BUF_SIZE      1024
134 
135  /*
136   * dgram_server.c
137   */
138 typedef void (*DGRAM_SERVER_FN) (int, char *, char **);
139 extern NORETURN dgram_server_main(int, char **, DGRAM_SERVER_FN,...);
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 /*        Wietse Venema
157 /*        porcupine.org
158 /*--*/
159