From a27448191c4ff6b807911c2b5076320b9d919639 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@dovecot.fi> Date: Tue, 23 Apr 2019 20:32:25 +0200 Subject: [PATCH] lib-sieve: sieve-error - Make c-source filename and line number available to error handlers. --- src/lib-sieve/sieve-error.c | 79 ++++++++++++++++++++++++++----- src/lib-sieve/sieve-error.h | 73 +++++++++++++++++++++++----- src/lib-sieve/sieve-generator.c | 14 ++++++ src/lib-sieve/sieve-generator.h | 23 ++++++--- src/lib-sieve/sieve-interpreter.c | 26 +++++++++- src/lib-sieve/sieve-interpreter.h | 29 +++++++++--- src/lib-sieve/sieve-lexer.c | 20 ++++++-- src/lib-sieve/sieve-parser.c | 10 +++- src/lib-sieve/sieve-result.c | 52 ++++++++++++++++++-- src/lib-sieve/sieve-result.h | 64 ++++++++++++++++++++----- src/lib-sieve/sieve-validator.c | 9 ++++ src/lib-sieve/sieve-validator.h | 11 ++++- 12 files changed, 346 insertions(+), 64 deletions(-) diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c index eb9737c72..cecbdec5c 100644 --- a/src/lib-sieve/sieve-error.c +++ b/src/lib-sieve/sieve-error.c @@ -173,12 +173,16 @@ void sieve_global_info_logv(struct sieve_instance *svinst, SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args); } +#undef sieve_global_error void sieve_global_error(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -191,12 +195,16 @@ void sieve_global_error(struct sieve_instance *svinst, va_end(args); } +#undef sieve_global_warning void sieve_global_warning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -209,12 +217,16 @@ void sieve_global_warning(struct sieve_instance *svinst, va_end(args); } +#undef sieve_global_info void sieve_global_info(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_INFO, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -227,12 +239,17 @@ void sieve_global_info(struct sieve_instance *svinst, va_end(args); } +#undef sieve_global_info_error void sieve_global_info_error(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -245,12 +262,17 @@ void sieve_global_info_error(struct sieve_instance *svinst, va_end(args); } +#undef sieve_global_info_warning void sieve_global_info_warning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -267,11 +289,15 @@ void sieve_global_info_warning(struct sieve_instance *svinst, * Default (user) error functions */ +#undef sieve_internal_error void sieve_internal_error(struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *user_prefix) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; char str[256]; @@ -314,14 +340,20 @@ void sieve_criticalv(struct sieve_instance *svinst, sieve_direct_logv(svinst, svinst->system_ehandler, &new_params, 0, fmt, args); - sieve_internal_error(ehandler, params->location, user_prefix); + sieve_internal_error(ehandler, + params->csrc.filename, params->csrc.linenum, + params->location, user_prefix); } -void sieve_error(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) +#undef sieve_error +void sieve_error(struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -334,11 +366,15 @@ void sieve_error(struct sieve_error_handler *ehandler, const char *location, va_end(args); } -void sieve_warning(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) +#undef sieve_warning +void sieve_warning(struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -351,11 +387,15 @@ void sieve_warning(struct sieve_error_handler *ehandler, const char *location, va_end(args); } -void sieve_info(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) +#undef sieve_info +void sieve_info(struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_INFO, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -368,11 +408,15 @@ void sieve_info(struct sieve_error_handler *ehandler, const char *location, va_end(args); } -void sieve_debug(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) +#undef sieve_debug +void sieve_debug(struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_DEBUG, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -385,12 +429,17 @@ void sieve_debug(struct sieve_error_handler *ehandler, const char *location, va_end(args); } +#undef sieve_critical void sieve_critical(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, const char *location, - const char *user_prefix, const char *fmt, ...) + struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *user_prefix, + const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -786,13 +835,16 @@ sieve_logfile_vprintf(struct sieve_logfile_ehandler *ehandler, } } -inline static void ATTR_FORMAT(4, 5) +inline static void ATTR_FORMAT(6, 7) sieve_logfile_printf(struct sieve_logfile_ehandler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *prefix, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_INFO, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -921,7 +973,8 @@ static void sieve_logfile_start(struct sieve_logfile_ehandler *ehandler) tm = localtime(&now); if (strftime(buf, sizeof(buf), "%b %d %H:%M:%S", tm) > 0) { - sieve_logfile_printf(ehandler, "sieve", "info", + sieve_logfile_printf(ehandler, __FILE__, __LINE__, + "sieve", "info", "started log at %s", buf); } } diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h index 9b6e988f4..564b70440 100644 --- a/src/lib-sieve/sieve-error.h +++ b/src/lib-sieve/sieve-error.h @@ -23,6 +23,12 @@ struct sieve_error_handler; struct sieve_error_params { enum log_type log_type; + /* Location log command in C source code */ + struct { + const char *filename; + unsigned int linenum; + } csrc; + /* Location in Sieve source script */ const char *location; }; @@ -50,24 +56,46 @@ void sieve_global_info_logv(struct sieve_instance *svinst, void sieve_global_error(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(4, 5); + ATTR_FORMAT(6, 7); +#define sieve_global_error(svinst, ehandler, ...) \ + sieve_global_error(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__) void sieve_global_warning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(4, 5); + ATTR_FORMAT(6, 7); +#define sieve_global_warning(svinst, ehandler, ...) \ + sieve_global_warning(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__) void sieve_global_info(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(4, 5); + ATTR_FORMAT(6, 7); +#define sieve_global_info(svinst, ehandler, ...) \ + sieve_global_info(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__) void sieve_global_info_error(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(4, 5); + ATTR_FORMAT(6, 7); +#define sieve_global_info_error(svinst, ehandler, ...) \ + sieve_global_info_error(svinst, ehandler, __FILE__, __LINE__, \ + __VA_ARGS__) void sieve_global_info_warning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(4, 5); + ATTR_FORMAT(6, 7); +#define sieve_global_info_warning(svinst, ehandler, ...) \ + sieve_global_info_warning(svinst, ehandler, __FILE__, __LINE__, \ + __VA_ARGS__) /* * Main (user) error functions @@ -91,22 +119,41 @@ void sieve_criticalv(struct sieve_instance *svinst, ATTR_FORMAT(5, 0); void sieve_error(struct sieve_error_handler *ehandler, - const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4); + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6); +#define sieve_error(ehandler, ...) \ + sieve_error(ehandler, __FILE__, __LINE__, __VA_ARGS__) void sieve_warning(struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(3, 4); + ATTR_FORMAT(5, 6); +#define sieve_warning(ehandler, ...) \ + sieve_warning(ehandler, __FILE__, __LINE__, __VA_ARGS__) void sieve_info(struct sieve_error_handler *ehandler, - const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4); + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6); +#define sieve_info(ehandler, ...) \ + sieve_info(ehandler, __FILE__, __LINE__, __VA_ARGS__) void sieve_debug(struct sieve_error_handler *ehandler, - const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4); + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6); +#define sieve_debug(ehandler, ...) \ + sieve_debug(ehandler, __FILE__, __LINE__, __VA_ARGS__) void sieve_critical(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, const char *location, - const char *user_prefix, const char *fmt, ...) - ATTR_FORMAT(5, 6); + struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, + const char *location, const char *user_prefix, + const char *fmt, ...) ATTR_FORMAT(7, 8); +#define sieve_critical(svinst, ehandler, ...) \ + sieve_critical(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__) + void sieve_internal_error(struct sieve_error_handler *ehandler, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *user_prefix) - ATTR_NULL(1, 2, 3); + ATTR_NULL(1, 4, 5); +#define sieve_internal_error(ehandler, ...) \ + sieve_internal_error(ehandler, __FILE__, __LINE__, __VA_ARGS__) /* * Error handler configuration diff --git a/src/lib-sieve/sieve-generator.c b/src/lib-sieve/sieve-generator.c index 00f4989be..ae47067b8 100644 --- a/src/lib-sieve/sieve-generator.c +++ b/src/lib-sieve/sieve-generator.c @@ -510,11 +510,15 @@ sieve_generator_run(struct sieve_generator *gentr, * Error handling */ +#undef sieve_generator_error void sieve_generator_error(struct sieve_generator *gentr, + const char *csrc_filename, unsigned int csrc_linenum, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -526,11 +530,16 @@ void sieve_generator_error(struct sieve_generator *gentr, va_end(args); } +#undef sieve_generator_warning void sieve_generator_warning(struct sieve_generator *gentr, + const char *csrc_filename, + unsigned int csrc_linenum, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -542,11 +551,16 @@ void sieve_generator_warning(struct sieve_generator *gentr, va_end(args); } +#undef sieve_generator_critical void sieve_generator_critical(struct sieve_generator *gentr, + const char *csrc_filename, + unsigned int csrc_linenum, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; diff --git a/src/lib-sieve/sieve-generator.h b/src/lib-sieve/sieve-generator.h index c31823cba..fab2023ba 100644 --- a/src/lib-sieve/sieve-generator.h +++ b/src/lib-sieve/sieve-generator.h @@ -97,14 +97,25 @@ sieve_generator_run(struct sieve_generator *gentr, */ void sieve_generator_error(struct sieve_generator *gentr, - unsigned int source_line, - const char *fmt, ...) ATTR_FORMAT(3, 4); + const char *csrc_filename, unsigned int csrc_linenum, + unsigned int source_line, const char *fmt, ...) + ATTR_FORMAT(5, 6); +#define sieve_generator_error(gentr, ...) \ + sieve_generator_error(gentr, __FILE__, __LINE__, __VA_ARGS__) void sieve_generator_warning(struct sieve_generator *gentr, - unsigned int source_line, - const char *fmt, ...) ATTR_FORMAT(3, 4); + const char *csrc_filename, + unsigned int csrc_linenum, + unsigned int source_line, const char *fmt, ...) + ATTR_FORMAT(5, 6); +#define sieve_generator_warning(gentr, ...) \ + sieve_generator_warning(gentr, __FILE__, __LINE__, __VA_ARGS__) void sieve_generator_critical(struct sieve_generator *gentr, - unsigned int source_line, - const char *fmt, ...) ATTR_FORMAT(3, 4); + const char *csrc_filename, + unsigned int csrc_linenum, + unsigned int source_line, const char *fmt, ...) + ATTR_FORMAT(5, 6); +#define sieve_generator_critical(gentr, ...) \ + sieve_generator_critical(gentr, __FILE__, __LINE__, __VA_ARGS__) #endif diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 36df8c242..67a703515 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -964,11 +964,15 @@ sieve_runtime_logv(const struct sieve_runtime_env *renv, } T_END; } +#undef sieve_runtime_error void sieve_runtime_error(const struct sieve_runtime_env *renv, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -978,11 +982,15 @@ void sieve_runtime_error(const struct sieve_runtime_env *renv, va_end(args); } +#undef sieve_runtime_warning void sieve_runtime_warning(const struct sieve_runtime_env *renv, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -992,11 +1000,15 @@ void sieve_runtime_warning(const struct sieve_runtime_env *renv, va_end(args); } +#undef sieve_runtime_log void sieve_runtime_log(const struct sieve_runtime_env *renv, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_INFO, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -1006,12 +1018,17 @@ void sieve_runtime_log(const struct sieve_runtime_env *renv, va_end(args); } +#undef sieve_runtime_critical void sieve_runtime_critical(const struct sieve_runtime_env *renv, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *user_prefix, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, .location = location, }; va_list args; @@ -1031,8 +1048,12 @@ void sieve_runtime_critical(const struct sieve_runtime_env *renv, va_end(args); } +#undef sieve_runtime_mail_error int sieve_runtime_mail_error(const struct sieve_runtime_env *renv, - struct mail *mail, const char *fmt, ...) + struct mail *mail, + const char *csrc_filename, + unsigned int csrc_linenum, + const char *fmt, ...) { const char *error_msg, *user_prefix; va_list args; @@ -1041,7 +1062,8 @@ int sieve_runtime_mail_error(const struct sieve_runtime_env *renv, va_start(args, fmt); user_prefix = t_strdup_vprintf(fmt, args); - sieve_runtime_critical(renv, NULL, user_prefix, "%s: %s", + sieve_runtime_critical(renv, csrc_filename, csrc_linenum, + NULL, user_prefix, "%s: %s", user_prefix, error_msg); va_end(args); diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h index 1e28e0334..2a81c8d05 100644 --- a/src/lib-sieve/sieve-interpreter.h +++ b/src/lib-sieve/sieve-interpreter.h @@ -170,19 +170,36 @@ int sieve_interpreter_run(struct sieve_interpreter *interp, */ void sieve_runtime_error(const struct sieve_runtime_env *renv, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(3, 4); + ATTR_FORMAT(5, 6); +#define sieve_runtime_error(renv, ...) \ + sieve_runtime_error(renv, __FILE__, __LINE__, __VA_ARGS__) void sieve_runtime_warning(const struct sieve_runtime_env *renv, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(3, 4); + ATTR_FORMAT(5, 6); +#define sieve_runtime_warning(renv, ...) \ + sieve_runtime_warning(renv, __FILE__, __LINE__, __VA_ARGS__) void sieve_runtime_log(const struct sieve_runtime_env *renv, + const char *csrc_filename, unsigned int csrc_linenum, const char *location, const char *fmt, ...) - ATTR_FORMAT(3, 4); + ATTR_FORMAT(5, 6); +#define sieve_runtime_log(renv, ...) \ + sieve_runtime_log(renv, __FILE__, __LINE__, __VA_ARGS__) void sieve_runtime_critical(const struct sieve_runtime_env *renv, + const char *csrc_filename, + unsigned int csrc_linenum, const char *location, const char *user_prefix, - const char *fmt, ...) ATTR_FORMAT(4, 5); + const char *fmt, ...) ATTR_FORMAT(6, 7); +#define sieve_runtime_critical(renv, ...) \ + sieve_runtime_critical(renv, __FILE__, __LINE__, __VA_ARGS__) int sieve_runtime_mail_error(const struct sieve_runtime_env *renv, - struct mail *mail, const char *fmt, ...) - ATTR_FORMAT(3, 4); + struct mail *mail, + const char *csrc_filename, + unsigned int csrc_linenum, + const char *fmt, ...) ATTR_FORMAT(5, 6); +#define sieve_runtime_mail_error(renv, mail, ...) \ + sieve_runtime_mail_error(renv, mail, __FILE__, __LINE__, __VA_ARGS__) #endif diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c index 1e38556d0..1572a455a 100644 --- a/src/lib-sieve/sieve-lexer.c +++ b/src/lib-sieve/sieve-lexer.c @@ -120,12 +120,16 @@ void sieve_lexer_free(const struct sieve_lexer **_lexer) * Internal error handling */ -inline static void ATTR_FORMAT(2, 3) -sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...) +inline static void ATTR_FORMAT(4, 5) +sieve_lexer_error(const struct sieve_lexer *lexer, + const char *csrc_filename, unsigned int csrc_linenum, + const char *fmt, ...) { struct sieve_lexical_scanner *scanner = lexer->scanner; struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -140,13 +144,19 @@ sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...) va_end(args); } +#define sieve_lexer_error(lexer, ...) \ + sieve_lexer_error(lexer, __FILE__, __LINE__, __VA_ARGS__) -inline static void ATTR_FORMAT(2, 3) -sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...) +inline static void ATTR_FORMAT(4, 5) +sieve_lexer_warning(const struct sieve_lexer *lexer, + const char *csrc_filename, unsigned int csrc_linenum, + const char *fmt, ...) { struct sieve_lexical_scanner *scanner = lexer->scanner; struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -161,6 +171,8 @@ sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...) va_end(args); } +#define sieve_lexer_warning(lexer, ...) \ + sieve_lexer_warning(lexer, __FILE__, __LINE__, __VA_ARGS__) const char *sieve_lexer_token_description(const struct sieve_lexer *lexer) { diff --git a/src/lib-sieve/sieve-parser.c b/src/lib-sieve/sieve-parser.c index bfe38553e..71dc1f750 100644 --- a/src/lib-sieve/sieve-parser.c +++ b/src/lib-sieve/sieve-parser.c @@ -88,11 +88,15 @@ void sieve_parser_free(struct sieve_parser **parser) * Internal error handling */ -inline static void ATTR_FORMAT(2, 3) -sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...) +inline static void ATTR_FORMAT(4, 5) +sieve_parser_error(struct sieve_parser *parser, + const char *csrc_filename, unsigned int csrc_linenum, + const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -112,6 +116,8 @@ sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...) va_end(args); } +#define sieve_parser_error(parser, ...) \ + sieve_parser_error(parser, __FILE__, __LINE__, __VA_ARGS__) /* * Sieve grammar parsing diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index b409db632..a6694f712 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -1530,11 +1530,15 @@ void sieve_side_effects_list_add(struct sieve_side_effects_list *list, * Error handling */ +#undef sieve_result_error void sieve_result_error(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1543,11 +1547,15 @@ void sieve_result_error(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_global_error void sieve_result_global_error(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1556,11 +1564,15 @@ void sieve_result_global_error(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_warning void sieve_result_warning(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1569,11 +1581,16 @@ void sieve_result_warning(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_global_warning void sieve_result_global_warning(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1582,11 +1599,15 @@ void sieve_result_global_warning(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_log void sieve_result_log(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_INFO, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1595,11 +1616,15 @@ void sieve_result_log(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_global_log void sieve_result_global_log(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_INFO, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1608,11 +1633,16 @@ void sieve_result_global_log(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_global_log_error void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1622,11 +1652,16 @@ void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_global_log_warning void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1636,11 +1671,15 @@ void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_critical void sieve_result_critical(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, unsigned int csrc_linenum, const char *user_prefix, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1654,8 +1693,11 @@ void sieve_result_critical(const struct sieve_action_exec_env *aenv, va_end(args); } +#undef sieve_result_mail_error int sieve_result_mail_error(const struct sieve_action_exec_env *aenv, - struct mail *mail, const char *fmt, ...) + struct mail *mail, + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) { const char *error_msg, *user_prefix; va_list args; @@ -1664,8 +1706,8 @@ int sieve_result_mail_error(const struct sieve_action_exec_env *aenv, va_start(args, fmt); user_prefix = t_strdup_vprintf(fmt, args); - sieve_result_critical(aenv, user_prefix, "%s: %s", - user_prefix, error_msg); + sieve_result_critical(aenv, csrc_filename, csrc_linenum, + user_prefix, "%s: %s", user_prefix, error_msg); va_end(args); return SIEVE_EXEC_TEMP_FAILURE; diff --git a/src/lib-sieve/sieve-result.h b/src/lib-sieve/sieve-result.h index 194720706..5d7f4ecf5 100644 --- a/src/lib-sieve/sieve-result.h +++ b/src/lib-sieve/sieve-result.h @@ -142,27 +142,69 @@ void sieve_side_effects_list_add(struct sieve_side_effects_list *list, */ void sieve_result_error(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, unsigned int csrc_linenum, + const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_error(aenv, ...) \ + sieve_result_error(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_global_error(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_global_error(aenv, ...) \ + sieve_result_global_error(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_warning(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, unsigned int csrc_linenum, + const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_warning(aenv, ...) \ + sieve_result_warning(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_global_warning(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, + unsigned int csrc_linenum, + const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_global_warning(aenv, ...) \ + sieve_result_global_warning(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_log(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, unsigned int csrc_linenum, + const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_log(aenv, ...) \ + sieve_result_log(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_global_log(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_global_log(aenv, ...) \ + sieve_result_global_log(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, + unsigned int csrc_linenum, + const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_global_log_error(aenv, ...) \ + sieve_result_global_log_error(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv, - const char *fmt, ...) ATTR_FORMAT(2, 3); + const char *csrc_filename, + unsigned int csrc_linenum, + const char *fmt, ...) + ATTR_FORMAT(4, 5); +#define sieve_result_global_log_warning(aenv, ...) \ + sieve_result_global_log_warning(aenv, __FILE__, __LINE__, __VA_ARGS__) void sieve_result_critical(const struct sieve_action_exec_env *aenv, + const char *csrc_filename, unsigned int csrc_linenum, const char *user_prefix, const char *fmt, ...) - ATTR_FORMAT(3, 4); + ATTR_FORMAT(5, 6); +#define sieve_result_critical(aenv, ...) \ + sieve_result_critical(aenv, __FILE__, __LINE__, __VA_ARGS__) int sieve_result_mail_error(const struct sieve_action_exec_env *aenv, - struct mail *mail, const char *fmt, ...) - ATTR_FORMAT(3, 4); + struct mail *mail, + const char *csrc_filename, + unsigned int csrc_linenum, const char *fmt, ...) + ATTR_FORMAT(5, 6); +#define sieve_result_mail_error(aenv, mail, ...) \ + sieve_result_mail_error(aenv, mail, __FILE__, __LINE__, __VA_ARGS__) #endif diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c index 6f605564a..d0c96f81a 100644 --- a/src/lib-sieve/sieve-validator.c +++ b/src/lib-sieve/sieve-validator.c @@ -1659,11 +1659,15 @@ sieve_validator_object_registry_init(struct sieve_validator *valdtr, * Error handling */ +#undef sieve_validator_error void sieve_validator_error(struct sieve_validator *valdtr, + const char *csrc_filename, unsigned int csrc_linenum, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_ERROR, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; @@ -1675,11 +1679,16 @@ void sieve_validator_error(struct sieve_validator *valdtr, va_end(args); } +#undef sieve_validator_warning void sieve_validator_warning(struct sieve_validator *valdtr, + const char *csrc_filename, + unsigned int csrc_linenum, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { .log_type = LOG_TYPE_WARNING, + .csrc.filename = csrc_filename, + .csrc.linenum = csrc_linenum, }; va_list args; diff --git a/src/lib-sieve/sieve-validator.h b/src/lib-sieve/sieve-validator.h index 43d9cf6c9..21b41ccf1 100644 --- a/src/lib-sieve/sieve-validator.h +++ b/src/lib-sieve/sieve-validator.h @@ -181,10 +181,17 @@ sieve_validator_object_registry_init(struct sieve_validator *valdtr, */ void sieve_validator_error(struct sieve_validator *valdtr, + const char *csrc_filename, unsigned int csrc_linenum, unsigned int source_line, const char *fmt, ...) - ATTR_FORMAT(3, 4); + ATTR_FORMAT(5, 6); +#define sieve_validator_error(valdtr, ...) \ + sieve_validator_error(valdtr, __FILE__, __LINE__, __VA_ARGS__) void sieve_validator_warning(struct sieve_validator *valdtr, + const char *csrc_filename, + unsigned int csrc_linenum, unsigned int source_line, const char *fmt, ...) - ATTR_FORMAT(3, 4); + ATTR_FORMAT(5, 6); +#define sieve_validator_warning(valdtr, ...) \ + sieve_validator_warning(valdtr, __FILE__, __LINE__, __VA_ARGS__) #endif -- GitLab