commit 000aebbc28be0da5daf72d06752fd090eb8c6248 from: Martijn van Duren date: Fri Aug 23 13:13:25 2019 UTC Add enhanced code functions for reject and disconnect 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 *, ...)