commit - 332b3141862058633cc02e659ba3df0eb5e3e25c
commit + 30f1cbacdec202675f3b67c0012a07733e5420a0
blob - 5838abb8be9d0cd93177c84b49f0fc730a39ed67
blob + 8e734bf777879e641a62ac39fd5ae1279589423b
--- opensmtpd.c
+++ opensmtpd.c
void
osmtpd_register_report_connect(int incoming, void (*cb)(struct osmtpd_ctx *,
- const char *, const char *, struct sockaddr_storage *,
+ const char *, enum osmtpd_status, struct sockaddr_storage *,
struct sockaddr_storage *))
{
osmtpd_register(OSMTPD_TYPE_FILTER, OSMTPD_PHASE_LINK_CONNECT, incoming,
osmtpd_err(1, NULL);
ctx->ctx.reqid = search.ctx.reqid;
ctx->ctx.rdns = NULL;
- ctx->ctx.fcrdns = NULL;
+ ctx->ctx.fcrdns = OSMTPD_STATUS_TEMPFAIL;
ctx->ctx.identity = NULL;
ctx->ctx.ciphers = NULL;
ctx->ctx.msgid = 0;
osmtpd_link_connect(struct osmtpd_callback *cb, struct osmtpd_ctx *ctx,
char *params, char *linedup)
{
- char *end, *rdns, *fcrdns;
+ char *end, *rdns;
+ enum osmtpd_status fcrdns;
struct sockaddr_storage src, dst;
- void (*f)(struct osmtpd_ctx *, const char *, const char *,
+ void (*f)(struct osmtpd_ctx *, const char *, enum osmtpd_status,
struct sockaddr_storage *, struct sockaddr_storage *);
if ((end = strchr(params, '|')) == NULL)
osmtpd_errx(1, "Invalid line received: missing src: %s",
linedup);
end++[0] = '\0';
- fcrdns = params;
+ if (strcmp(params, "pass") == 0)
+ fcrdns = OSMTPD_STATUS_OK;
+ else if (strcmp(params, "fail") == 0)
+ fcrdns = OSMTPD_STATUS_PERMFAIL;
+ else if (strcmp(params, "error") == 0)
+ fcrdns = OSMTPD_STATUS_TEMPFAIL;
+ else
+ osmtpd_errx(1, "Invalid line received: invalid fcrdns: %s",
+ linedup);
params = end;
if ((end = strchr(params, '|')) == NULL)
osmtpd_errx(1, "Invalid line received: missing dst: %s",
params = end;
osmtpd_addrtoss(params, &dst, 1, linedup);
if (cb->storereport) {
- if ((ctx->rdns = strdup(params)) == NULL)
- osmtpd_err(1, NULL);
- if ((ctx->fcrdns = strdup(params)) == NULL)
- osmtpd_err(1, NULL);
+ if ((ctx->rdns = strdup(rdns)) == NULL)
+ osmtpd_err(1, "strdup");
+ ctx->fcrdns = fcrdns;
memcpy(&(ctx->src), &src, sizeof(ctx->src));
memcpy(&(ctx->dst), &dst, sizeof(ctx->dst));
}
if (ondeletecb_session != NULL)
ondeletecb_session(ctx, session->ctx.local_session);
free(session->ctx.rdns);
- free(session->ctx.fcrdns);
free(session->ctx.identity);
free(session->ctx.ciphers);
free(session->ctx.mailfrom);
blob - 7733bb1633bbf1b09c266c69e45f8cf169013f63
blob + d64446d1c33281c97e789df8357fe71032adbf9a
--- opensmtpd.h
+++ opensmtpd.h
struct sockaddr_storage src;
struct sockaddr_storage dst;
char *rdns;
- char *fcrdns;
+ enum osmtpd_status fcrdns;
char *identity;
char *ciphers;
uint32_t msgid;
void osmtpd_register_filter_wiz(void (*)(struct osmtpd_ctx *));
void osmtpd_register_filter_commit(void (*)(struct osmtpd_ctx *));
void osmtpd_register_report_connect(int, void (*)(struct osmtpd_ctx *,
- const char *, const char *, struct sockaddr_storage *,
+ const char *, enum osmtpd_status, struct sockaddr_storage *,
struct sockaddr_storage *));
void osmtpd_register_report_disconnect(int, void (*)(struct osmtpd_ctx *));
void osmtpd_register_report_identify(int, void (*)(struct osmtpd_ctx *,
blob - fa067aa263e49955b1470cbd6195469f20e00ea0
blob + 089c86c392647191806288894f7d67cb10139b48
--- osmtpd_run.3
+++ osmtpd_run.3
.Ft void
.Fo osmtpd_register_report_connect
.Fa "int incoming"
-.Fa "void (*cb)(struct osmtpd_ctx *ctx, const char *rdns, const char *fcrdns, struct sockaddr_storage *src, struct sockaddr_storage *dst)"
+.Fa "void (*cb)(struct osmtpd_ctx *ctx, const char *rdns, enum osmtpd_status fcrdns, struct sockaddr_storage *src, struct sockaddr_storage *dst)"
.Fc
.Ft void
.Fo osmtpd_register_report_disconnect
.Dv OSMTPD_NEED_RDNS .
If not available the attribute is set to
.Dv NULL .
-.It Vt char Va *fcrdns
-The forward confirmed reverse DNS hostname of the connection.
+.It Vt enum osmtpd_status Va fcrdns
+Whether the reverse DNS hostname is forward confirmed.
To use this attribute
.Nm osmtpd_need
needs to be initialized with
.Dv OSMTPD_NEED_FCRDNS .
If not available the attribute is set to
-.Dv NULL .
+.Dv OSMTPD_STATUS_TEMPFAIL .
.It Vt char Va *identity
The identity of the remote host as presented by the helo or ehlo smtp command.
To use this attribute