commit d229c1230652b1b3184296bf0ab7e987938d09bf from: Martijn van Duren date: Thu Aug 22 05:49:15 2019 UTC Move opensmtpd_priv.h into opensmtpd.c. It's not going to be used outside the file commit - 4fb726123ba56ecd6994f718ca9944b17c4a37c0 commit + d229c1230652b1b3184296bf0ab7e987938d09bf blob - a48260a5eb6a3d11e723e81e8f95aa2e50037d46 blob + 982566ed5b64fc6cc41835fcdc4a835f5eefba17 --- opensmtpd.c +++ opensmtpd.c @@ -40,15 +40,480 @@ #define NITEMS(x) (sizeof(x) / sizeof(*x)) +struct osmtpd_callback { + enum osmtpd_type type; + enum osmtpd_phase phase; + int incoming; + void (*osmtpd_cb)(struct osmtpd_callback *, struct osmtpd_ctx *, char *, + char *); + void *cb; + int doregister; + int storereport; +}; + +struct osmtpd_session { + struct osmtpd_ctx ctx; + RB_ENTRY(osmtpd_session) entry; +}; + +static void osmtpd_register(enum osmtpd_type, enum osmtpd_phase, int, int, + void *); +static const char *osmtpd_typetostr(enum osmtpd_type); +static const char *osmtpd_phasetostr(enum osmtpd_phase); +static enum osmtpd_phase osmtpd_strtophase(const char *, const char *); +static void osmtpd_newline(struct io *, int, void *); +static void osmtpd_outevt(struct io *, int, void *); +static void osmtpd_noargs(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_onearg(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_connect(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_link_connect(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_link_disconnect(struct osmtpd_callback *, + struct osmtpd_ctx *, char *, char *); +static void osmtpd_link_identify(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_link_tls(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_tx_begin(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_tx_mail(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_tx_rcpt(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_tx_envelope(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_tx_data(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_tx_commit(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_tx_rollback(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); +static void osmtpd_addrtoss(char *, struct sockaddr_storage *, int, char *); +static enum osmtpd_status osmtpd_strtostatus(const char *, char *); +static int osmtpd_session_cmp(struct osmtpd_session *, struct osmtpd_session *); +static void *(*oncreatecb)(struct osmtpd_ctx *) = NULL; +static void (*ondeletecb)(struct osmtpd_ctx *, void *) = NULL; + + +static struct osmtpd_callback osmtpd_callbacks[] = { + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_CONNECT, + 1, + osmtpd_connect, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_HELO, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_EHLO, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_STARTTLS, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_AUTH, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_MAIL_FROM, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_RCPT_TO, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_DATA, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_DATA_LINE, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_RSET, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_QUIT, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_NOOP, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_HELP, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_WIZ, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_FILTER, + OSMTPD_PHASE_COMMIT, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_CONNECT, + 1, + osmtpd_link_connect, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_DISCONNECT, + 1, + osmtpd_link_disconnect, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_IDENTIFY, + 1, + osmtpd_link_identify, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_TLS, + 1, + osmtpd_link_tls, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_BEGIN, + 1, + osmtpd_tx_begin, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_MAIL, + 1, + osmtpd_tx_mail, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_RCPT, + 1, + osmtpd_tx_rcpt, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_ENVELOPE, + 1, + osmtpd_tx_envelope, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_DATA, + 1, + osmtpd_tx_data, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_COMMIT, + 1, + osmtpd_tx_commit, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_ROLLBACK, + 1, + osmtpd_tx_rollback, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_PROTOCOL_CLIENT, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_PROTOCOL_SERVER, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_FILTER_RESPONSE, + 1, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TIMEOUT, + 1, + osmtpd_noargs, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_CONNECT, + 0, + osmtpd_link_connect, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_DISCONNECT, + 0, + osmtpd_link_disconnect, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_IDENTIFY, + 0, + osmtpd_link_identify, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_TLS, + 0, + osmtpd_link_tls, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_BEGIN, + 0, + osmtpd_tx_begin, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_MAIL, + 0, + osmtpd_tx_mail, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_RCPT, + 0, + osmtpd_tx_rcpt, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_ENVELOPE, + 0, + osmtpd_tx_envelope, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_DATA, + 0, + osmtpd_tx_data, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_COMMIT, + 0, + osmtpd_tx_commit, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TX_ROLLBACK, + 0, + osmtpd_tx_rollback, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_PROTOCOL_CLIENT, + 0, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_PROTOCOL_SERVER, + 0, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_FILTER_RESPONSE, + 0, + osmtpd_onearg, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_TIMEOUT, + 0, + osmtpd_noargs, + NULL, + 0, + 0 + } +}; + static struct io *io_stdout; - -RB_HEAD(osmtpd_sessions, osmtpd_session) osmtpd_sessions = RB_INITIALIZER(NULL); -RB_PROTOTYPE(osmtpd_sessions, osmtpd_session, entry, osmtpd_session_cmp); - static int ready = 0; /* Default from smtpd */ static int session_timeout = 300; +RB_HEAD(osmtpd_sessions, osmtpd_session) osmtpd_sessions = RB_INITIALIZER(NULL); +RB_PROTOTYPE(osmtpd_sessions, osmtpd_session, entry, osmtpd_session_cmp); + void osmtpd_register_filter_connect(void (*cb)(struct osmtpd_ctx *, const char *, struct sockaddr_storage *)) blob - 77e3caf57b2a00d8ffc439f99d39c0db3975040c (mode 644) blob + /dev/null --- opensmtpd_priv.h +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright (c) 2019 Martijn van Duren - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -struct osmtpd_callback { - enum osmtpd_type type; - enum osmtpd_phase phase; - int incoming; - void (*osmtpd_cb)(struct osmtpd_callback *, struct osmtpd_ctx *, char *, - char *); - void *cb; - int doregister; - int storereport; -}; - -struct osmtpd_session { - struct osmtpd_ctx ctx; - RB_ENTRY(osmtpd_session) entry; -}; - -static void osmtpd_register(enum osmtpd_type, enum osmtpd_phase, int, int, - void *); -static const char *osmtpd_typetostr(enum osmtpd_type); -static const char *osmtpd_phasetostr(enum osmtpd_phase); -static enum osmtpd_phase osmtpd_strtophase(const char *, const char *); -static void osmtpd_newline(struct io *, int, void *); -static void osmtpd_outevt(struct io *, int, void *); -static void osmtpd_noargs(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_onearg(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_connect(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_link_connect(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_link_disconnect(struct osmtpd_callback *, - struct osmtpd_ctx *, char *, char *); -static void osmtpd_link_identify(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_link_tls(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_tx_begin(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_tx_mail(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_tx_rcpt(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_tx_envelope(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_tx_data(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_tx_commit(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_tx_rollback(struct osmtpd_callback *, struct osmtpd_ctx *, - char *, char *); -static void osmtpd_addrtoss(char *, struct sockaddr_storage *, int, char *); -static enum osmtpd_status osmtpd_strtostatus(const char *, char *); -static int osmtpd_session_cmp(struct osmtpd_session *, struct osmtpd_session *); -static void *(*oncreatecb)(struct osmtpd_ctx *) = NULL; -static void (*ondeletecb)(struct osmtpd_ctx *, void *) = NULL; - - -static struct osmtpd_callback osmtpd_callbacks[] = { - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_CONNECT, - 1, - osmtpd_connect, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_HELO, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_EHLO, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_STARTTLS, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_AUTH, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_MAIL_FROM, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_RCPT_TO, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_DATA, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_DATA_LINE, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_RSET, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_QUIT, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_NOOP, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_HELP, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_WIZ, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_FILTER, - OSMTPD_PHASE_COMMIT, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_CONNECT, - 1, - osmtpd_link_connect, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_DISCONNECT, - 1, - osmtpd_link_disconnect, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_IDENTIFY, - 1, - osmtpd_link_identify, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_TLS, - 1, - osmtpd_link_tls, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_BEGIN, - 1, - osmtpd_tx_begin, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_MAIL, - 1, - osmtpd_tx_mail, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_RCPT, - 1, - osmtpd_tx_rcpt, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_ENVELOPE, - 1, - osmtpd_tx_envelope, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_DATA, - 1, - osmtpd_tx_data, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_COMMIT, - 1, - osmtpd_tx_commit, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_ROLLBACK, - 1, - osmtpd_tx_rollback, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_PROTOCOL_CLIENT, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_PROTOCOL_SERVER, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_FILTER_RESPONSE, - 1, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TIMEOUT, - 1, - osmtpd_noargs, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_CONNECT, - 0, - osmtpd_link_connect, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_DISCONNECT, - 0, - osmtpd_link_disconnect, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_IDENTIFY, - 0, - osmtpd_link_identify, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_LINK_TLS, - 0, - osmtpd_link_tls, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_BEGIN, - 0, - osmtpd_tx_begin, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_MAIL, - 0, - osmtpd_tx_mail, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_RCPT, - 0, - osmtpd_tx_rcpt, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_ENVELOPE, - 0, - osmtpd_tx_envelope, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_DATA, - 0, - osmtpd_tx_data, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_COMMIT, - 0, - osmtpd_tx_commit, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TX_ROLLBACK, - 0, - osmtpd_tx_rollback, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_PROTOCOL_CLIENT, - 0, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_PROTOCOL_SERVER, - 0, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_FILTER_RESPONSE, - 0, - osmtpd_onearg, - NULL, - 0, - 0 - }, - { - OSMTPD_TYPE_REPORT, - OSMTPD_PHASE_TIMEOUT, - 0, - osmtpd_noargs, - NULL, - 0, - 0 - } -};