Commit Diff


commit - 332b3141862058633cc02e659ba3df0eb5e3e25c
commit + 30f1cbacdec202675f3b67c0012a07733e5420a0
blob - 5838abb8be9d0cd93177c84b49f0fc730a39ed67
blob + 8e734bf777879e641a62ac39fd5ae1279589423b
--- opensmtpd.c
+++ opensmtpd.c
@@ -652,7 +652,7 @@ osmtpd_register_filter_commit(void (*cb)(struct osmtpd
 
 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,
@@ -1067,7 +1067,7 @@ osmtpd_newline(struct io *io, int ev, void *arg)
 				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;
@@ -1178,9 +1178,10 @@ static void
 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)
@@ -1193,7 +1194,15 @@ osmtpd_link_connect(struct osmtpd_callback *cb, struct
 		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",
@@ -1203,10 +1212,9 @@ osmtpd_link_connect(struct osmtpd_callback *cb, struct
 	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));
 	}
@@ -1232,7 +1240,6 @@ osmtpd_link_disconnect(struct osmtpd_callback *cb, str
 		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
@@ -82,7 +82,7 @@ struct osmtpd_ctx {
 	struct sockaddr_storage	 src;
 	struct sockaddr_storage	 dst;
 	char			*rdns;
-	char			*fcrdns;
+	enum osmtpd_status	 fcrdns;
 	char			*identity;
 	char			*ciphers;
 	uint32_t		 msgid;
@@ -112,7 +112,7 @@ void osmtpd_register_filter_help(void (*)(struct osmtp
 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
@@ -126,7 +126,7 @@
 .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
@@ -391,14 +391,14 @@ needs to be initialized with
 .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