Commit Diff


commit - 13f4885fe52bcb1a246aab40deb68cab40a43054
commit + 000aebbc28be0da5daf72d06752fd090eb8c6248
blob - c951b1b8fb15770604629dfe852ab6e65144315a
blob + 265ff18659139017ffbe529bc5a264b0a249a2cd
--- Symbols.list
+++ Symbols.list
@@ -31,6 +31,8 @@ osmtpd_register_report_timeout
 osmtpd_filter_proceed
 osmtpd_filter_reject
 osmtpd_filter_disconnect
+osmtpd_filter_reject_enh
+osmtpd_filter_disconnect_enh
 osmtpd_filter_dataline
 osmtpd_local_session
 osmtpd_local_message
blob - 1b6969ad945fe2e4ae2ae31f29210327a5eb890f
blob + 30496cb0eaceccf2339b844eb52978d651974452
--- opensmtpd.c
+++ opensmtpd.c
@@ -1575,6 +1575,30 @@ osmtpd_filter_reject(struct osmtpd_ctx *ctx, int code,
 }
 
 void
+osmtpd_filter_reject_enh(struct osmtpd_ctx *ctx, int code, int class,
+    int subject, int detail, const char *reason, ...)
+{
+	va_list ap;
+
+	if (code < 200 || code > 599)
+		osmtpd_errx(1, "Invalid reject code");
+	if (class <= 2 || class >= 5)
+		osmtpd_errx(1, "Invalid enhanced status class");
+	if (subject < 0 || subject > 999)
+		osmtpd_errx(1, "Invalid enhanced status subject");
+	if (detail < 0 || detail > 999)
+		osmtpd_errx(1, "Invalid enhanced status detail");
+
+	io_printf(io_stdout, "filter-result|%016"PRIx64"|%016"PRIx64"|reject|"
+	    "%d %d.%d.%d ", ctx->token, ctx->reqid, code, class, subject,
+	    detail);
+	va_start(ap, reason);
+	io_vprintf(io_stdout, reason, ap);
+	va_end(ap);
+	io_printf(io_stdout, "\n");
+}
+
+void
 osmtpd_filter_disconnect(struct osmtpd_ctx *ctx, const char *reason, ...)
 {
 	va_list ap;
@@ -1588,6 +1612,27 @@ osmtpd_filter_disconnect(struct osmtpd_ctx *ctx, const
 }
 
 void
+osmtpd_filter_disconnect_enh(struct osmtpd_ctx *ctx, int class, int subject,
+    int detail, const char *reason, ...)
+{
+	va_list ap;
+
+	if (class <= 2 || class >= 5)
+		osmtpd_errx(1, "Invalid enhanced status class");
+	if (subject < 0 || subject > 999)
+		osmtpd_errx(1, "Invalid enhanced status subject");
+	if (detail < 0 || detail > 999)
+		osmtpd_errx(1, "Invalid enhanced status detail");
+	io_printf(io_stdout, "filter-result|%016"PRIx64"|%016"PRIx64"|"
+	    "disconnect|421 %d.%d.%d ", ctx->token, ctx->reqid, class, subject,
+	    detail);
+	va_start(ap, reason);
+	io_vprintf(io_stdout, reason, ap);
+	va_end(ap);
+	io_printf(io_stdout, "\n");
+}
+
+void
 osmtpd_filter_rewrite(struct osmtpd_ctx *ctx, const char *value, ...)
 {
 	va_list ap;
blob - d64446d1c33281c97e789df8357fe71032adbf9a
blob + a4cb221b9c7c93fe14f90027a2a6c9956e8b054b
--- opensmtpd.h
+++ opensmtpd.h
@@ -148,8 +148,14 @@ void osmtpd_need(int);
 void osmtpd_filter_proceed(struct osmtpd_ctx *);
 void osmtpd_filter_reject(struct osmtpd_ctx *, int, const char *, ...)
 	__attribute__((__format__ (printf, 3, 4)));
+void osmtpd_filter_reject_enh(struct osmtpd_ctx *, int, int, int, int,
+    const char *, ...)
+	__attribute__((__format__ (printf, 6, 7)));
 void osmtpd_filter_disconnect(struct osmtpd_ctx *, const char *, ...)
 	__attribute__((__format__ (printf, 2, 3)));
+void osmtpd_filter_disconnect_enh(struct osmtpd_ctx *, int, int, int,
+    const char *, ...)
+	__attribute__((__format__ (printf, 5, 6)));
 void osmtpd_filter_rewrite(struct osmtpd_ctx *, const char *, ...)
 	__attribute__((__format__ (printf, 2, 3)));
 void osmtpd_filter_dataline(struct osmtpd_ctx *, const char *, ...)