2 * Copyright (c) 2019 Martijn van Duren <martijn@openbsd.org>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 #include <sys/socket.h>
19 #define __dead __attribute__((__noreturn__))
22 #define __unused __attribute__((unused))
27 OSMTPD_STATUS_TEMPFAIL,
28 OSMTPD_STATUS_PERMFAIL
40 OSMTPD_PHASE_STARTTLS,
42 OSMTPD_PHASE_MAIL_FROM,
45 OSMTPD_PHASE_DATA_LINE,
52 OSMTPD_PHASE_LINK_CONNECT,
53 OSMTPD_PHASE_LINK_DISCONNECT,
54 OSMTPD_PHASE_LINK_GREETING,
55 OSMTPD_PHASE_LINK_IDENTIFY,
56 OSMTPD_PHASE_LINK_TLS,
57 OSMTPD_PHASE_TX_BEGIN,
60 OSMTPD_PHASE_TX_ENVELOPE,
62 OSMTPD_PHASE_TX_COMMIT,
63 OSMTPD_PHASE_TX_ROLLBACK,
64 OSMTPD_PHASE_PROTOCOL_CLIENT,
65 OSMTPD_PHASE_PROTOCOL_SERVER,
66 OSMTPD_PHASE_FILTER_RESPONSE,
70 #define OSMTPD_NEED_SRC 1 << 0
71 #define OSMTPD_NEED_DST 1 << 1
72 #define OSMTPD_NEED_RDNS 1 << 2
73 #define OSMTPD_NEED_FCRDNS 1 << 3
74 #define OSMTPD_NEED_IDENTITY 1 << 4
75 #define OSMTPD_NEED_GREETING 1 << 5
76 #define OSMTPD_NEED_CIPHERS 1 << 6
77 #define OSMTPD_NEED_MSGID 1 << 7
78 #define OSMTPD_NEED_MAILFROM 1 << 8
79 #define OSMTPD_NEED_RCPTTO 1 << 9
80 #define OSMTPD_NEED_EVPID 1 << 10
83 enum osmtpd_type type;
84 enum osmtpd_phase phase;
91 struct sockaddr_storage src;
92 struct sockaddr_storage dst;
94 enum osmtpd_status fcrdns;
95 /* HELO/EHLO identity */
99 /* textstring not supplied by smtpd */
110 void osmtpd_register_conf(void (*)(const char *, const char *));
111 void osmtpd_register_filter_connect(void (*)(struct osmtpd_ctx *, const char *,
112 struct sockaddr_storage *));
113 void osmtpd_register_filter_helo(void (*)(struct osmtpd_ctx *, const char *));
114 void osmtpd_register_filter_ehlo(void (*)(struct osmtpd_ctx *, const char *));
115 void osmtpd_register_filter_starttls(void (*)(struct osmtpd_ctx *));
116 void osmtpd_register_filter_auth(void (*)(struct osmtpd_ctx *, const char *));
117 void osmtpd_register_filter_mailfrom(void (*)(struct osmtpd_ctx *,
119 void osmtpd_register_filter_rcptto(void (*)(struct osmtpd_ctx *, const char *));
120 void osmtpd_register_filter_data(void (*)(struct osmtpd_ctx *));
121 void osmtpd_register_filter_dataline(void (*)(struct osmtpd_ctx *,
123 void osmtpd_register_filter_rset(void (*)(struct osmtpd_ctx *));
124 void osmtpd_register_filter_quit(void (*)(struct osmtpd_ctx *));
125 void osmtpd_register_filter_noop(void (*)(struct osmtpd_ctx *));
126 void osmtpd_register_filter_help(void (*)(struct osmtpd_ctx *));
127 void osmtpd_register_filter_wiz(void (*)(struct osmtpd_ctx *));
128 void osmtpd_register_filter_commit(void (*)(struct osmtpd_ctx *));
129 void osmtpd_register_report_connect(int, void (*)(struct osmtpd_ctx *,
130 const char *, enum osmtpd_status, struct sockaddr_storage *,
131 struct sockaddr_storage *));
132 void osmtpd_register_report_disconnect(int, void (*)(struct osmtpd_ctx *));
133 void osmtpd_register_report_greeting(int, void (*)(struct osmtpd_ctx *,
135 void osmtpd_register_report_identify(int, void (*)(struct osmtpd_ctx *,
137 void osmtpd_register_report_tls(int, void (*)(struct osmtpd_ctx *,
139 void osmtpd_register_report_begin(int, void (*)(struct osmtpd_ctx *, uint32_t));
140 void osmtpd_register_report_mail(int, void (*)(struct osmtpd_ctx *, uint32_t,
141 const char *, enum osmtpd_status));
142 void osmtpd_register_report_rcpt(int, void (*)(struct osmtpd_ctx *, uint32_t,
143 const char *, enum osmtpd_status));
144 void osmtpd_register_report_envelope(int, void (*)(struct osmtpd_ctx *, uint32_t,
146 void osmtpd_register_report_data(int, void (*)(struct osmtpd_ctx *, uint32_t,
147 enum osmtpd_status));
148 void osmtpd_register_report_commit(int, void (*)(struct osmtpd_ctx *, uint32_t,
150 void osmtpd_register_report_rollback(int, void (*)(struct osmtpd_ctx *,
152 void osmtpd_register_report_client(int, void (*)(struct osmtpd_ctx *,
154 void osmtpd_register_report_server(int, void (*)(struct osmtpd_ctx *,
156 void osmtpd_register_report_response(int, void (*)(struct osmtpd_ctx *,
158 void osmtpd_register_report_timeout(int, void (*)(struct osmtpd_ctx *));
159 void osmtpd_local_session(void *(*)(struct osmtpd_ctx *),
160 void (*)(struct osmtpd_ctx *, void *));
161 void osmtpd_local_message(void *(*)(struct osmtpd_ctx *),
162 void (*)(struct osmtpd_ctx *, void *));
163 void osmtpd_need(int);
165 void osmtpd_filter_proceed(struct osmtpd_ctx *);
166 void osmtpd_filter_reject(struct osmtpd_ctx *, int, const char *, ...)
167 __attribute__((__format__ (printf, 3, 4)));
168 void osmtpd_filter_reject_enh(struct osmtpd_ctx *, int, int, int, int,
170 __attribute__((__format__ (printf, 6, 7)));
171 void osmtpd_filter_disconnect(struct osmtpd_ctx *, const char *, ...)
172 __attribute__((__format__ (printf, 2, 3)));
173 void osmtpd_filter_disconnect_enh(struct osmtpd_ctx *, int, int, int,
175 __attribute__((__format__ (printf, 5, 6)));
176 void osmtpd_filter_rewrite(struct osmtpd_ctx *, const char *, ...)
177 __attribute__((__format__ (printf, 2, 3)));
178 void osmtpd_filter_dataline(struct osmtpd_ctx *, const char *, ...)
179 __attribute__((__format__ (printf, 2, 3)));
180 void osmtpd_run(void);
181 __dead void osmtpd_err(int eval, const char *fmt, ...);
182 __dead void osmtpd_errx(int eval, const char *fmt, ...);