diff --git a/src/lib-sieve/sieve-error-private.h b/src/lib-sieve/sieve-error-private.h index b9caee5f2e4ccb28952c22cde939d3123d4dfb70..b4c21ef2483c9842a7a69ca52d62f9c49ed049c0 100644 --- a/src/lib-sieve/sieve-error-private.h +++ b/src/lib-sieve/sieve-error-private.h @@ -42,22 +42,10 @@ struct sieve_error_handler { bool log_info; bool log_debug; - void (*verror)(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(4, 0); - void (*vwarning)(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(4, 0); - void (*vinfo)(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(4, 0); - void (*vdebug)(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(4, 0); + void (*logv)(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, + const char *fmt, va_list args) ATTR_FORMAT(4, 0); void (*free)(struct sieve_error_handler *ehandler); }; @@ -74,76 +62,22 @@ void sieve_error_handler_init_from_parent(struct sieve_error_handler *ehandler, * Direct handler calls */ -void sieve_direct_verror(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(5, 0); -void sieve_direct_vwarning(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(5, 0); -void sieve_direct_vinfo(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(5, 0); -void sieve_direct_vdebug(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) - ATTR_FORMAT(5, 0); - -static inline void ATTR_FORMAT(5, 6) -sieve_direct_error(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - sieve_direct_verror(svinst, ehandler, params, flags, fmt, args); - va_end(args); -} - -static inline void ATTR_FORMAT(5, 6) -sieve_direct_warning(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - sieve_direct_vwarning(svinst, ehandler, params, flags, fmt, args); - va_end(args); -} - -static inline void ATTR_FORMAT(5, 6) -sieve_direct_info(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - sieve_direct_vinfo(svinst, ehandler, params, flags, fmt, args); - va_end(args); -} +void sieve_direct_logv(struct sieve_instance *svinst, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, + const char *fmt, va_list args) ATTR_FORMAT(5, 0); static inline void ATTR_FORMAT(5, 6) -sieve_direct_debug(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, ...) +sieve_direct_log(struct sieve_instance *svinst, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_direct_vdebug(svinst, ehandler, params, flags, fmt, args); + sieve_direct_logv(svinst, ehandler, params, flags, fmt, args); va_end(args); } diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c index 5bb67a4b80ad293ee5333ffb5edc8e0529c70be6..c1b35c7d9156fde104a64bd3aa94fd933d5c08ab 100644 --- a/src/lib-sieve/sieve-error.c +++ b/src/lib-sieve/sieve-error.c @@ -72,78 +72,32 @@ void sieve_errors_deinit(struct sieve_instance *svinst) * Direct handler calls */ -void sieve_direct_verror(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, - const char *fmt, va_list args) +void sieve_direct_logv(struct sieve_instance *svinst, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, + const char *fmt, va_list args) { if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 && (ehandler == NULL || ehandler->parent == NULL)) { i_assert(svinst->system_ehandler != NULL); if (svinst->system_ehandler != ehandler || - (flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) { + (params->log_type > LOG_TYPE_INFO && + flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) { + struct sieve_error_params new_params = *params; va_list args_copy; VA_COPY(args_copy, args); - if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) { - if (svinst->system_ehandler->vinfo != NULL) { - svinst->system_ehandler->vinfo( - svinst->system_ehandler, - params, 0, fmt, args_copy); - } - } else { - if (svinst->system_ehandler->verror != NULL) { - svinst->system_ehandler->verror( - svinst->system_ehandler, - params, 0, fmt, args_copy); - } - } - va_end(args_copy); - if (svinst->system_ehandler == ehandler) - return; - } - } - - if (ehandler == NULL) - return; - - if (ehandler->parent != NULL || sieve_errors_more_allowed(ehandler)) { - if (ehandler->verror != NULL) - ehandler->verror(ehandler, params, flags, fmt, args); - - if (ehandler->pool != NULL) - ehandler->errors++; - } -} + if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0 && + new_params.log_type > LOG_TYPE_INFO) + new_params.log_type = LOG_TYPE_INFO; -void sieve_direct_vwarning(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 && - (ehandler == NULL || ehandler->parent == NULL)) { - i_assert(svinst->system_ehandler != NULL); - if (svinst->system_ehandler != ehandler || - (flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) { - va_list args_copy; + i_assert(svinst->system_ehandler->logv != NULL); + svinst->system_ehandler->logv( + svinst->system_ehandler, &new_params, 0, + fmt, args_copy); - VA_COPY(args_copy, args); - if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) { - if (svinst->system_ehandler->vinfo != NULL) { - svinst->system_ehandler->vinfo( - svinst->system_ehandler, - params, 0, fmt, args_copy); - } - } else { - if (svinst->system_ehandler->vwarning != NULL) { - svinst->system_ehandler->vwarning( - svinst->system_ehandler, - params, 0, fmt, args_copy); - } - } va_end(args_copy); if (svinst->system_ehandler == ehandler) @@ -154,69 +108,27 @@ void sieve_direct_vwarning(struct sieve_instance *svinst, if (ehandler == NULL) return; - if (ehandler->vwarning != NULL) - ehandler->vwarning(ehandler, params, flags, fmt, args); - - if (ehandler->pool != NULL) - ehandler->warnings++; -} - -void sieve_direct_vinfo(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 && - (ehandler == NULL || ehandler->parent == NULL) && - svinst->system_ehandler != ehandler) { - i_assert(svinst->system_ehandler != NULL); - if (svinst->system_ehandler->vinfo != NULL) { - va_list args_copy; - - VA_COPY(args_copy, args); - svinst->system_ehandler->vinfo( - svinst->system_ehandler, params, 0, - fmt, args_copy); - va_end(args_copy); - } - } - - if (ehandler == NULL) - return; - - if (ehandler->parent != NULL || ehandler->log_info) { - if (ehandler->vinfo != NULL) - ehandler->vinfo(ehandler, params, flags, fmt, args); - } -} - -void sieve_direct_vdebug(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 && - (ehandler == NULL || ehandler->parent == NULL) && - svinst->system_ehandler != ehandler) { - i_assert(svinst->system_ehandler != NULL); - if (svinst->system_ehandler->vdebug != NULL) { - va_list args_copy; - - VA_COPY(args_copy, args); - svinst->system_ehandler->vdebug( - svinst->system_ehandler, params, 0, - fmt, args_copy); - va_end(args_copy); + if (ehandler->parent != NULL || + (params->log_type == LOG_TYPE_ERROR && + sieve_errors_more_allowed(ehandler)) || + (params->log_type == LOG_TYPE_INFO && ehandler->log_info) || + (params->log_type == LOG_TYPE_DEBUG && ehandler->log_debug)) { + i_assert(ehandler->logv != NULL); + ehandler->logv(ehandler, params, flags, fmt, args); + + if (ehandler->pool != NULL) { + switch (params->log_type) { + case LOG_TYPE_ERROR: + ehandler->errors++; + break; + case LOG_TYPE_WARNING: + ehandler->warnings++; + break; + default: + break; + } } } - - if (ehandler == NULL) - return; - - if (ehandler->parent != NULL || ehandler->log_debug) { - if (ehandler->vdebug != NULL) - ehandler->vdebug(ehandler, params, flags, fmt, args); - } } /* @@ -242,51 +154,23 @@ sieve_system_ehandler_get(struct sieve_instance *svinst) * User errors */ -void sieve_global_verror(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) -{ - sieve_direct_verror(svinst, ehandler, params, - SIEVE_ERROR_FLAG_GLOBAL, fmt, args); -} - -void sieve_global_vwarning(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) -{ - sieve_direct_vwarning(svinst, ehandler, params, - SIEVE_ERROR_FLAG_GLOBAL, fmt, args); -} - -void sieve_global_vinfo(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) -{ - sieve_direct_vinfo(svinst, ehandler, params, - SIEVE_ERROR_FLAG_GLOBAL, fmt, args); -} - -void sieve_global_info_verror(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) +void sieve_global_logv(struct sieve_instance *svinst, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + const char *fmt, va_list args) { - sieve_direct_verror(svinst, ehandler, params, - (SIEVE_ERROR_FLAG_GLOBAL | - SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args); + sieve_direct_logv(svinst, ehandler, params, + SIEVE_ERROR_FLAG_GLOBAL, fmt, args); } -void sieve_global_info_vwarning(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) +void sieve_global_info_logv(struct sieve_instance *svinst, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + const char *fmt, va_list args) { - sieve_direct_vwarning(svinst, ehandler, params, - (SIEVE_ERROR_FLAG_GLOBAL | - SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args); + sieve_direct_logv(svinst, ehandler, params, + (SIEVE_ERROR_FLAG_GLOBAL | + SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args); } void sieve_global_error(struct sieve_instance *svinst, @@ -294,13 +178,14 @@ void sieve_global_error(struct sieve_instance *svinst, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_verror(svinst, ehandler, ¶ms, fmt, args); + sieve_global_logv(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -311,13 +196,14 @@ void sieve_global_warning(struct sieve_instance *svinst, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_WARNING, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_vwarning(svinst, ehandler, ¶ms, fmt, args); + sieve_global_logv(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -328,13 +214,14 @@ void sieve_global_info(struct sieve_instance *svinst, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_INFO, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_vinfo(svinst, ehandler, ¶ms, fmt, args); + sieve_global_logv(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -345,13 +232,14 @@ void sieve_global_info_error(struct sieve_instance *svinst, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_info_verror(svinst, ehandler, ¶ms, fmt, args); + sieve_global_info_logv(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -362,14 +250,14 @@ void sieve_global_info_warning(struct sieve_instance *svinst, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_WARNING, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_info_vwarning(svinst, ehandler, ¶ms, - fmt, args); + sieve_global_info_logv(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -383,6 +271,7 @@ void sieve_internal_error(struct sieve_error_handler *ehandler, const char *location, const char *user_prefix) { struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, .location = location, }; char str[256]; @@ -397,48 +286,21 @@ void sieve_internal_error(struct sieve_error_handler *ehandler, str : CRITICAL_MSG); if (user_prefix == NULL || *user_prefix == '\0') { - sieve_direct_error(ehandler->svinst, ehandler, ¶ms, 0, - "%s", msg); + sieve_direct_log(ehandler->svinst, ehandler, ¶ms, 0, + "%s", msg); } else { - sieve_direct_error(ehandler->svinst, ehandler, ¶ms, 0, - "%s: %s", user_prefix, msg); + sieve_direct_log(ehandler->svinst, ehandler, ¶ms, 0, + "%s: %s", user_prefix, msg); } } -void sieve_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) -{ - if (ehandler == NULL) return; - - sieve_direct_verror(ehandler->svinst, ehandler, params, 0, fmt, args); -} - -void sieve_vwarning(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) -{ - if (ehandler == NULL) return; - - sieve_direct_vwarning(ehandler->svinst, ehandler, params, 0, fmt, args); -} - -void sieve_vinfo(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) -{ - if (ehandler == NULL) return; - - sieve_direct_vinfo(ehandler->svinst, ehandler, params, 0, fmt, args); -} - -void sieve_vdebug(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) +void sieve_logv(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + const char *fmt, va_list args) { if (ehandler == NULL) return; - sieve_direct_vdebug(ehandler->svinst, ehandler, params, 0, fmt, args); + sieve_direct_logv(ehandler->svinst, ehandler, params, 0, fmt, args); } void sieve_vcritical(struct sieve_instance *svinst, @@ -446,8 +308,12 @@ void sieve_vcritical(struct sieve_instance *svinst, const struct sieve_error_params *params, const char *user_prefix, const char *fmt, va_list args) { - sieve_direct_verror(svinst, svinst->system_ehandler, params, 0, - fmt, args); + struct sieve_error_params new_params = *params; + + new_params.log_type = LOG_TYPE_ERROR; + + sieve_direct_logv(svinst, svinst->system_ehandler, &new_params, 0, + fmt, args); sieve_internal_error(ehandler, params->location, user_prefix); } @@ -455,13 +321,14 @@ void sieve_error(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_verror(ehandler, ¶ms, fmt, args); + sieve_logv(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -471,13 +338,14 @@ void sieve_warning(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_WARNING, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vwarning(ehandler, ¶ms, fmt, args); + sieve_logv(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -487,13 +355,14 @@ void sieve_info(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_INFO, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vinfo(ehandler, ¶ms, fmt, args); + sieve_logv(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -503,13 +372,14 @@ void sieve_debug(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_DEBUG, .location = location, }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vdebug(ehandler, ¶ms, fmt, args); + sieve_logv(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -520,9 +390,11 @@ void sieve_critical(struct sieve_instance *svinst, const char *user_prefix, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, .location = location, }; va_list args; + va_start(args, fmt); T_BEGIN { @@ -668,15 +540,33 @@ struct sieve_master_ehandler { typedef void (*master_log_func_t)(const char *fmt, ...) ATTR_FORMAT(1, 2); static void ATTR_FORMAT(4, 0) -sieve_master_vlog(struct sieve_error_handler *_ehandler, +sieve_master_logv(struct sieve_error_handler *_ehandler, const struct sieve_error_params *params, - master_log_func_t log_func, + enum sieve_error_flags flags ATTR_UNUSED, const char *fmt, va_list args) { struct sieve_master_ehandler *ehandler = (struct sieve_master_ehandler *) _ehandler; + master_log_func_t log_func; string_t *str; + switch (params->log_type) { + case LOG_TYPE_ERROR: + log_func = i_error; + break; + case LOG_TYPE_WARNING: + log_func = i_warning; + break; + case LOG_TYPE_INFO: + log_func = i_info; + break; + case LOG_TYPE_DEBUG: + log_func = i_debug; + break; + default: + i_unreached(); + } + str = t_str_new(256); if (ehandler->prefix != NULL) str_printfa(str, "%s: ", ehandler->prefix); @@ -691,42 +581,6 @@ sieve_master_vlog(struct sieve_error_handler *_ehandler, log_func("%s", str_c(str)); } -static void ATTR_FORMAT(4, 0) -sieve_master_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_master_vlog(ehandler, params, i_error, fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_master_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_master_vlog(ehandler, params, i_warning, fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_master_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_master_vlog(ehandler, params, i_info, fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_master_vdebug(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_master_vlog(ehandler, params, i_debug, fmt, args); -} - struct sieve_error_handler * sieve_master_ehandler_create(struct sieve_instance *svinst, const char *prefix, unsigned int max_errors) @@ -738,10 +592,7 @@ sieve_master_ehandler_create(struct sieve_instance *svinst, const char *prefix, ehandler = p_new(pool, struct sieve_master_ehandler, 1); sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors); - ehandler->handler.verror = sieve_master_verror; - ehandler->handler.vwarning = sieve_master_vwarning; - ehandler->handler.vinfo = sieve_master_vinfo; - ehandler->handler.vdebug = sieve_master_vdebug; + ehandler->handler.logv = sieve_master_logv; if (prefix != NULL) ehandler->prefix = p_strdup(pool, prefix); @@ -758,10 +609,30 @@ sieve_master_ehandler_create(struct sieve_instance *svinst, const char *prefix, */ static void ATTR_FORMAT(4, 0) -sieve_stderr_vmessage(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - const char *prefix, const char *fmt, va_list args) +sieve_stderr_logv(struct sieve_error_handler *ehandler ATTR_UNUSED, + const struct sieve_error_params *params, + enum sieve_error_flags flags ATTR_UNUSED, + const char *fmt, va_list args) { + const char *prefix; + + switch (params->log_type) { + case LOG_TYPE_ERROR: + prefix = "error"; + break; + case LOG_TYPE_WARNING: + prefix = "warning"; + break; + case LOG_TYPE_INFO: + prefix = "info"; + break; + case LOG_TYPE_DEBUG: + prefix = "debug"; + break; + default: + i_unreached(); + } + if (params->location == NULL || *params->location == '\0') { fprintf(stderr, "%s: %s.\n", prefix, t_strdup_vprintf(fmt, args)); @@ -771,42 +642,6 @@ sieve_stderr_vmessage(struct sieve_error_handler *ehandler ATTR_UNUSED, } } -static void ATTR_FORMAT(4, 0) -sieve_stderr_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_stderr_vmessage(ehandler, params, "error", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_stderr_vwarning(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_stderr_vmessage(ehandler, params, "warning", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_stderr_vinfo(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_stderr_vmessage(ehandler, params, "info", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_stderr_vdebug(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_stderr_vmessage(ehandler, params, "debug", fmt, args); -} - struct sieve_error_handler * sieve_stderr_ehandler_create(struct sieve_instance *svinst, unsigned int max_errors) @@ -822,10 +657,7 @@ sieve_stderr_ehandler_create(struct sieve_instance *svinst, ehandler = p_new(pool, struct sieve_error_handler, 1); sieve_error_handler_init(ehandler, svinst, pool, max_errors); - ehandler->verror = sieve_stderr_verror; - ehandler->vwarning = sieve_stderr_vwarning; - ehandler->vinfo = sieve_stderr_vinfo; - ehandler->vdebug = sieve_stderr_vdebug; + ehandler->logv = sieve_stderr_logv; return ehandler; } @@ -843,12 +675,31 @@ struct sieve_strbuf_ehandler { }; static void ATTR_FORMAT(4, 0) -sieve_strbuf_vmessage(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *prefix, const char *fmt, va_list args) +sieve_strbuf_logv(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags ATTR_UNUSED, + const char *fmt, va_list args) { struct sieve_strbuf_ehandler *handler = (struct sieve_strbuf_ehandler *) ehandler; + const char *prefix; + + switch (params->log_type) { + case LOG_TYPE_ERROR: + prefix = "error"; + break; + case LOG_TYPE_WARNING: + prefix = "warning"; + break; + case LOG_TYPE_INFO: + prefix = "info"; + break; + case LOG_TYPE_DEBUG: + prefix = "debug"; + break; + default: + i_unreached(); + } if (params->location != NULL && *params->location != '\0') str_printfa(handler->errors, "%s: ", params->location); @@ -861,42 +712,6 @@ sieve_strbuf_vmessage(struct sieve_error_handler *ehandler, str_append(handler->errors, ".\r\n"); } -static void ATTR_FORMAT(4, 0) -sieve_strbuf_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_strbuf_vmessage(ehandler, params, "error", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_strbuf_vwarning(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_strbuf_vmessage(ehandler, params, "warning", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_strbuf_vinfo(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_strbuf_vmessage(ehandler, params, "info", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_strbuf_vdebug(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - sieve_strbuf_vmessage(ehandler, params, "debug", fmt, args); -} - struct sieve_error_handler * sieve_strbuf_ehandler_create(struct sieve_instance *svinst, string_t *strbuf, bool crlf, unsigned int max_errors) @@ -910,11 +725,7 @@ sieve_strbuf_ehandler_create(struct sieve_instance *svinst, string_t *strbuf, sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors); - ehandler->handler.verror = sieve_strbuf_verror; - ehandler->handler.vwarning = sieve_strbuf_vwarning; - ehandler->handler.vinfo = sieve_strbuf_vinfo; - ehandler->handler.vdebug = sieve_strbuf_vdebug; - + ehandler->handler.logv = sieve_strbuf_logv; ehandler->crlf = crlf; return &(ehandler->handler); @@ -981,6 +792,7 @@ sieve_logfile_printf(struct sieve_logfile_ehandler *ehandler, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_INFO, .location = location, }; va_list args; @@ -1116,63 +928,36 @@ static void sieve_logfile_start(struct sieve_logfile_ehandler *ehandler) } static void ATTR_FORMAT(4, 0) -sieve_logfile_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - struct sieve_logfile_ehandler *handler = - (struct sieve_logfile_ehandler *) ehandler; - - if (!handler->started) - sieve_logfile_start(handler); - - sieve_logfile_vprintf(handler, params, "error", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_logfile_vwarning(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - struct sieve_logfile_ehandler *handler = - (struct sieve_logfile_ehandler *) ehandler; - - if (!handler->started) - sieve_logfile_start(handler); - - sieve_logfile_vprintf(handler, params, "warning", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_logfile_vinfo(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) +sieve_logfile_logv(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags ATTR_UNUSED, + const char *fmt, va_list args) { struct sieve_logfile_ehandler *handler = (struct sieve_logfile_ehandler *) ehandler; + const char *prefix; if (!handler->started) sieve_logfile_start(handler); - sieve_logfile_vprintf(handler, params, "info", fmt, args); -} - -static void ATTR_FORMAT(4, 0) -sieve_logfile_vdebug(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - struct sieve_logfile_ehandler *handler = - (struct sieve_logfile_ehandler *) ehandler; - - if (!handler->started) - sieve_logfile_start(handler); + switch (params->log_type) { + case LOG_TYPE_ERROR: + prefix = "error"; + break; + case LOG_TYPE_WARNING: + prefix = "warning"; + break; + case LOG_TYPE_INFO: + prefix = "info"; + break; + case LOG_TYPE_DEBUG: + prefix = "debug"; + break; + default: + i_unreached(); + } - sieve_logfile_vprintf(handler, params, "debug", fmt, args); + sieve_logfile_vprintf(handler, params, prefix, fmt, args); } static void sieve_logfile_free(struct sieve_error_handler *ehandler) @@ -1204,10 +989,7 @@ sieve_logfile_ehandler_create(struct sieve_instance *svinst, ehandler = p_new(pool, struct sieve_logfile_ehandler, 1); sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors); - ehandler->handler.verror = sieve_logfile_verror; - ehandler->handler.vwarning = sieve_logfile_vwarning; - ehandler->handler.vinfo = sieve_logfile_vinfo; - ehandler->handler.vdebug = sieve_logfile_vdebug; + ehandler->handler.logv = sieve_logfile_logv; ehandler->handler.free = sieve_logfile_free; /* Don't open logfile until something is actually logged. @@ -1254,57 +1036,10 @@ _prefix_message(struct sieve_prefix_ehandler *ehandler, } static void ATTR_FORMAT(4, 0) -sieve_prefix_verror(struct sieve_error_handler *_ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - struct sieve_prefix_ehandler *ehandler = - (struct sieve_prefix_ehandler *) _ehandler; - struct sieve_error_params new_params = *params; - - new_params.location = ehandler->location; - - sieve_direct_error(_ehandler->svinst, _ehandler->parent, - &new_params, flags, "%s", - _prefix_message(ehandler, params, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -sieve_prefix_vwarning(struct sieve_error_handler *_ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - struct sieve_prefix_ehandler *ehandler = - (struct sieve_prefix_ehandler *) _ehandler; - struct sieve_error_params new_params = *params; - - new_params.location = ehandler->location; - - sieve_direct_warning(_ehandler->svinst, _ehandler->parent, - &new_params, flags, "%s", - _prefix_message(ehandler, params, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -sieve_prefix_vinfo(struct sieve_error_handler *_ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - struct sieve_prefix_ehandler *ehandler = - (struct sieve_prefix_ehandler *) _ehandler; - struct sieve_error_params new_params = *params; - - new_params.location = ehandler->location; - - sieve_direct_info(_ehandler->svinst, _ehandler->parent, - &new_params, flags, "%s", - _prefix_message(ehandler, params, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -sieve_prefix_vdebug(struct sieve_error_handler *_ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) +sieve_prefix_logv(struct sieve_error_handler *_ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, + const char *fmt, va_list args) { struct sieve_prefix_ehandler *ehandler = (struct sieve_prefix_ehandler *) _ehandler; @@ -1312,9 +1047,9 @@ sieve_prefix_vdebug(struct sieve_error_handler *_ehandler, new_params.location = ehandler->location; - sieve_direct_debug(_ehandler->svinst, _ehandler->parent, - &new_params, flags, "%s", - _prefix_message(ehandler, params, fmt, args)); + sieve_direct_log(_ehandler->svinst, _ehandler->parent, + &new_params, flags, "%s", + _prefix_message(ehandler, params, fmt, args)); } struct sieve_error_handler * @@ -1334,10 +1069,7 @@ sieve_prefix_ehandler_create(struct sieve_error_handler *parent, ehandler->location = p_strdup(pool, location); ehandler->prefix = p_strdup(pool, prefix); - ehandler->handler.verror = sieve_prefix_verror; - ehandler->handler.vwarning = sieve_prefix_vwarning; - ehandler->handler.vinfo = sieve_prefix_vinfo; - ehandler->handler.vdebug = sieve_prefix_vdebug; + ehandler->handler.logv = sieve_prefix_logv; return &(ehandler->handler); } @@ -1389,43 +1121,14 @@ _expand_message(struct sieve_error_handler *_ehandler, } static void ATTR_FORMAT(4, 0) -sieve_varexpand_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - sieve_direct_error(ehandler->svinst, ehandler->parent, - params, flags, "%s", - _expand_message(ehandler, params, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -sieve_varexpand_vwarning(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - sieve_direct_warning(ehandler->svinst, ehandler->parent, - params, flags, "%s", - _expand_message(ehandler, params, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -sieve_varexpand_vinfo(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - sieve_direct_info(ehandler->svinst, ehandler->parent, - params, flags, "%s", - _expand_message(ehandler, params, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -sieve_varexpand_vdebug(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) +sieve_varexpand_logv(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, + const char *fmt, va_list args) { - sieve_direct_debug(ehandler->svinst, ehandler->parent, - params, flags, "%s", - _expand_message(ehandler, params, fmt, args)); + sieve_direct_log(ehandler->svinst, ehandler->parent, + params, flags, "%s", + _expand_message(ehandler, params, fmt, args)); } struct sieve_error_handler * @@ -1473,10 +1176,7 @@ sieve_varexpand_ehandler_create(struct sieve_error_handler *parent, (void)array_append_space(&ehandler->table); - ehandler->handler.verror = sieve_varexpand_verror; - ehandler->handler.vwarning = sieve_varexpand_vwarning; - ehandler->handler.vinfo = sieve_varexpand_vinfo; - ehandler->handler.vdebug = sieve_varexpand_vdebug; + ehandler->handler.logv = sieve_varexpand_logv; return &(ehandler->handler); } diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h index 19dc0ce0e24c0da8b53d5e84934c02b95c6d32d8..5e633ff9fe0dadb7d0260d40c7b0394939a36083 100644 --- a/src/lib-sieve/sieve-error.h +++ b/src/lib-sieve/sieve-error.h @@ -21,18 +21,12 @@ struct sieve_error_handler; */ struct sieve_error_params { + enum log_type log_type; + /* Location in Sieve source script */ const char *location; }; -typedef void (*sieve_error_vfunc_t)(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) - ATTR_FORMAT(3, 0);; -typedef void (*sieve_error_func_t)(struct sieve_error_handler *ehandler, - const char *location, const char *fmt, ...) - ATTR_FORMAT(3, 4); - /* * System errors */ @@ -45,27 +39,14 @@ sieve_system_ehandler_get(struct sieve_instance *svinst); * Global (user+system) errors */ -void sieve_global_verror(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(4, 0); -void sieve_global_vwarning(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(4, 0); -void sieve_global_vinfo(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(4, 0); -void sieve_global_info_verror(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(4, 0); -void sieve_global_info_vwarning(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) - ATTR_FORMAT(4, 0); +void sieve_global_logv(struct sieve_instance *svinst, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + const char *fmt, va_list args) ATTR_FORMAT(4, 0); +void sieve_global_info_logv(struct sieve_instance *svinst, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + const char *fmt, va_list args) ATTR_FORMAT(4, 0); void sieve_global_error(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, @@ -100,32 +81,24 @@ const char * sieve_error_script_location(const struct sieve_script *script, unsigned int source_line); -void sieve_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(3, 0); -void sieve_vwarning(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(3, 0); -void sieve_vinfo(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(3, 0); -void sieve_vdebug(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - const char *fmt, va_list args) ATTR_FORMAT(3, 0); +void sieve_logv(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + const char *fmt, va_list args) ATTR_FORMAT(3, 0); void sieve_vcritical(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, const struct sieve_error_params *params, const char *user_prefix, const char *fmt, va_list args) ATTR_FORMAT(5, 0); -void sieve_error(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) ATTR_FORMAT(3, 4); -void sieve_warning(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) ATTR_FORMAT(3, 4); -void sieve_info(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) ATTR_FORMAT(3, 4); -void sieve_debug(struct sieve_error_handler *ehandler, const char *location, - const char *fmt, ...) ATTR_FORMAT(3, 4); +void sieve_error(struct sieve_error_handler *ehandler, + const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4); +void sieve_warning(struct sieve_error_handler *ehandler, + const char *location, const char *fmt, ...) + ATTR_FORMAT(3, 4); +void sieve_info(struct sieve_error_handler *ehandler, + const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4); +void sieve_debug(struct sieve_error_handler *ehandler, + const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4); void sieve_critical(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, const char *location, const char *user_prefix, const char *fmt, ...) diff --git a/src/lib-sieve/sieve-generator.c b/src/lib-sieve/sieve-generator.c index 4546201f5196a70001be4edeb7e526cd3a9b44a3..ad0505abf55747742321c6c1c3268a6dcc976a24 100644 --- a/src/lib-sieve/sieve-generator.c +++ b/src/lib-sieve/sieve-generator.c @@ -514,7 +514,7 @@ void sieve_generator_error(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; @@ -522,7 +522,7 @@ void sieve_generator_error(struct sieve_generator *gentr, sieve_error_script_location(gentr->genenv.script, source_line); va_start(args, fmt); - sieve_verror(gentr->ehandler, ¶ms, fmt, args); + sieve_logv(gentr->ehandler, ¶ms, fmt, args); va_end(args); } @@ -530,7 +530,7 @@ void sieve_generator_warning(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_WARNING, }; va_list args; @@ -538,7 +538,7 @@ void sieve_generator_warning(struct sieve_generator *gentr, sieve_error_script_location(gentr->genenv.script, source_line); va_start(args, fmt); - sieve_vwarning(gentr->ehandler, ¶ms, fmt, args); + sieve_logv(gentr->ehandler, ¶ms, fmt, args); va_end(args); } @@ -546,7 +546,7 @@ void sieve_generator_critical(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; @@ -554,6 +554,7 @@ void sieve_generator_critical(struct sieve_generator *gentr, sieve_error_script_location(gentr->genenv.script, source_line); va_start(args, fmt); - sieve_vwarning(gentr->ehandler, ¶ms, fmt, args); + sieve_vcritical(gentr->genenv.svinst, gentr->ehandler, ¶ms, + "Code generation failed", fmt, args); va_end(args); } diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 5614e251f36e694dc6a16ccaff72047d37869186..5cc079cec446460d7bcf6069c4dab7045411b25c 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -947,10 +947,10 @@ int sieve_interpreter_run(struct sieve_interpreter *interp, * Error handling */ -static inline void ATTR_FORMAT(4, 0) +static inline void ATTR_FORMAT(3, 0) sieve_runtime_logv(const struct sieve_runtime_env *renv, const struct sieve_error_params *params, - sieve_error_vfunc_t msg_func, const char *fmt, va_list args) + const char *fmt, va_list args) { struct sieve_error_params new_params = *params; @@ -960,7 +960,7 @@ sieve_runtime_logv(const struct sieve_runtime_env *renv, sieve_runtime_get_full_command_location(renv); } - msg_func(renv->ehandler, params, fmt, args); + sieve_logv(renv->ehandler, params, fmt, args); } T_END; } @@ -968,12 +968,13 @@ void sieve_runtime_error(const struct sieve_runtime_env *renv, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, .location = location, }; va_list args; va_start(args, fmt); - sieve_runtime_logv(renv, ¶ms, sieve_verror, fmt, args); + sieve_runtime_logv(renv, ¶ms, fmt, args); va_end(args); } @@ -981,12 +982,13 @@ void sieve_runtime_warning(const struct sieve_runtime_env *renv, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_WARNING, .location = location, }; va_list args; va_start(args, fmt); - sieve_runtime_logv(renv, ¶ms, sieve_vwarning, fmt, args); + sieve_runtime_logv(renv, ¶ms, fmt, args); va_end(args); } @@ -994,12 +996,13 @@ void sieve_runtime_log(const struct sieve_runtime_env *renv, const char *location, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_INFO, .location = location, }; va_list args; va_start(args, fmt); - sieve_runtime_logv(renv, ¶ms, sieve_vinfo, fmt, args); + sieve_runtime_logv(renv, ¶ms, fmt, args); va_end(args); } @@ -1008,6 +1011,7 @@ void sieve_runtime_critical(const struct sieve_runtime_env *renv, const char *fmt, ...) { struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, .location = location, }; va_list args; diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c index 30678b71cf6bbd5d73ab45cf72cfb905b1031cc0..1e38556d0507407507f56a1a2986e26645cdfad7 100644 --- a/src/lib-sieve/sieve-lexer.c +++ b/src/lib-sieve/sieve-lexer.c @@ -125,7 +125,7 @@ sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...) { struct sieve_lexical_scanner *scanner = lexer->scanner; struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; @@ -135,7 +135,7 @@ sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...) params.location = sieve_error_script_location(scanner->script, scanner->current_line); - sieve_verror(scanner->ehandler, ¶ms, fmt, args); + sieve_logv(scanner->ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -146,7 +146,7 @@ sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...) { struct sieve_lexical_scanner *scanner = lexer->scanner; struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_WARNING, }; va_list args; @@ -156,7 +156,7 @@ sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...) params.location = sieve_error_script_location(scanner->script, scanner->current_line); - sieve_vwarning(scanner->ehandler, ¶ms, fmt, args); + sieve_logv(scanner->ehandler, ¶ms, fmt, args); } T_END; va_end(args); diff --git a/src/lib-sieve/sieve-parser.c b/src/lib-sieve/sieve-parser.c index dfe67c550900ab74fce190aaa715b72a565a4e6b..bfe38553e0c66f916d74da547a3dd4635cd078e5 100644 --- a/src/lib-sieve/sieve-parser.c +++ b/src/lib-sieve/sieve-parser.c @@ -92,7 +92,7 @@ inline static void ATTR_FORMAT(2, 3) sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; @@ -104,7 +104,7 @@ sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...) params.location = sieve_error_script_location( parser->script, sieve_lexer_token_line(parser->lexer)); - sieve_verror(parser->ehandler, ¶ms, fmt, args); + sieve_logv(parser->ehandler, ¶ms, fmt, args); } T_END; } diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index 184eada5b72aefdb48bb6a39b747a6d2c60a7a1f..c5b2300415954f63534fc8209ecbc196855a2c46 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -1534,12 +1534,12 @@ void sieve_result_error(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; va_start(args, fmt); - sieve_verror(aenv->ehandler, ¶ms, fmt, args); + sieve_logv(aenv->ehandler, ¶ms, fmt, args); va_end(args); } @@ -1547,12 +1547,12 @@ void sieve_result_global_error(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; va_start(args, fmt); - sieve_global_verror(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); + sieve_global_logv(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); va_end(args); } @@ -1560,12 +1560,12 @@ void sieve_result_warning(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_WARNING, }; va_list args; va_start(args, fmt); - sieve_vwarning(aenv->ehandler, ¶ms, fmt, args); + sieve_logv(aenv->ehandler, ¶ms, fmt, args); va_end(args); } @@ -1573,12 +1573,12 @@ void sieve_result_global_warning(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_WARNING, }; va_list args; va_start(args, fmt); - sieve_global_vwarning(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); + sieve_global_logv(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); va_end(args); } @@ -1586,12 +1586,12 @@ void sieve_result_log(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_INFO, }; va_list args; va_start(args, fmt); - sieve_vinfo(aenv->ehandler, ¶ms, fmt, args); + sieve_logv(aenv->ehandler, ¶ms, fmt, args); va_end(args); } @@ -1599,12 +1599,12 @@ void sieve_result_global_log(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_INFO, }; va_list args; va_start(args, fmt); - sieve_global_vinfo(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); + sieve_global_logv(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); va_end(args); } @@ -1612,13 +1612,13 @@ void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; va_start(args, fmt); - sieve_global_info_verror(aenv->svinst, aenv->ehandler, ¶ms, - fmt, args); + sieve_global_info_logv(aenv->svinst, aenv->ehandler, ¶ms, + fmt, args); va_end(args); } @@ -1626,25 +1626,28 @@ void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_WARNING, }; va_list args; va_start(args, fmt); - sieve_global_info_vwarning(aenv->svinst, aenv->ehandler, ¶ms, - fmt, args); + sieve_global_info_logv(aenv->svinst, aenv->ehandler, ¶ms, + fmt, args); va_end(args); } void sieve_result_critical(const struct sieve_action_exec_env *aenv, const char *user_prefix, const char *fmt, ...) { + struct sieve_error_params params = { + .log_type = LOG_TYPE_ERROR, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vcritical(aenv->svinst, aenv->ehandler, NULL, + sieve_vcritical(aenv->svinst, aenv->ehandler, ¶ms, user_prefix, fmt, args); } T_END; diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c index cc49bb610fc72d738c4093b2dd35fb2958de717f..6f605564ada691fc5a0d12cfe64f4de0f2f53600 100644 --- a/src/lib-sieve/sieve-validator.c +++ b/src/lib-sieve/sieve-validator.c @@ -1663,7 +1663,7 @@ void sieve_validator_error(struct sieve_validator *valdtr, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_ERROR, }; va_list args; @@ -1671,7 +1671,7 @@ void sieve_validator_error(struct sieve_validator *valdtr, sieve_error_script_location(valdtr->script, source_line); va_start(args, fmt); - sieve_verror(valdtr->ehandler, ¶ms, fmt, args); + sieve_logv(valdtr->ehandler, ¶ms, fmt, args); va_end(args); } @@ -1679,7 +1679,7 @@ void sieve_validator_warning(struct sieve_validator *valdtr, unsigned int source_line, const char *fmt, ...) { struct sieve_error_params params = { - .location = NULL, + .log_type = LOG_TYPE_WARNING, }; va_list args; @@ -1687,7 +1687,7 @@ void sieve_validator_warning(struct sieve_validator *valdtr, sieve_error_script_location(valdtr->script, source_line); va_start(args, fmt); - sieve_vwarning(valdtr->ehandler, ¶ms, fmt, args); + sieve_logv(valdtr->ehandler, ¶ms, fmt, args); va_end(args); } diff --git a/src/plugins/lda-sieve/lda-sieve-log.c b/src/plugins/lda-sieve/lda-sieve-log.c index 98669a81d299ced82ce2afcbe1ae8059326e570a..2b256a0865ceca360964b8cf98add9794e9955c9 100644 --- a/src/plugins/lda-sieve/lda-sieve-log.c +++ b/src/plugins/lda-sieve/lda-sieve-log.c @@ -41,43 +41,13 @@ lda_sieve_log_expand_message(struct sieve_error_handler *_ehandler, } static void ATTR_FORMAT(4, 0) -lda_sieve_log_verror(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) +lda_sieve_logv(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, const char *fmt, va_list args) { - sieve_direct_error(ehandler->svinst, ehandler->parent, - params, flags, "%s", - lda_sieve_log_expand_message(ehandler, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -lda_sieve_log_vwarning(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - sieve_direct_warning(ehandler->svinst, ehandler->parent, - params, flags, "%s", - lda_sieve_log_expand_message(ehandler, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -lda_sieve_log_vinfo(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - sieve_direct_info(ehandler->svinst, ehandler->parent, - params, flags, "%s", - lda_sieve_log_expand_message(ehandler, fmt, args)); -} - -static void ATTR_FORMAT(4, 0) -lda_sieve_log_vdebug(struct sieve_error_handler *ehandler, - const struct sieve_error_params *params, - unsigned int flags, const char *fmt, va_list args) -{ - sieve_direct_debug(ehandler->svinst, ehandler->parent, - params, flags, "%s", - lda_sieve_log_expand_message(ehandler, fmt, args)); + sieve_direct_log(ehandler->svinst, ehandler->parent, + params, flags, "%s", + lda_sieve_log_expand_message(ehandler, fmt, args)); } struct sieve_error_handler * @@ -95,11 +65,7 @@ lda_sieve_log_ehandler_create(struct sieve_error_handler *parent, sieve_error_handler_init_from_parent(&ehandler->handler, pool, parent); ehandler->mdctx = mdctx; - - ehandler->handler.verror = lda_sieve_log_verror; - ehandler->handler.vwarning = lda_sieve_log_vwarning; - ehandler->handler.vinfo = lda_sieve_log_vinfo; - ehandler->handler.vdebug = lda_sieve_log_vdebug; + ehandler->handler.logv = lda_sieve_logv; return &(ehandler->handler); } diff --git a/src/testsuite/testsuite-log.c b/src/testsuite/testsuite-log.c index 84ca4c55bcbc7c332fc747805291676cde34fd29..2cecda65315ba48b4dc1407cc42cbc2cb102d3cd 100644 --- a/src/testsuite/testsuite-log.c +++ b/src/testsuite/testsuite-log.c @@ -56,28 +56,63 @@ _testsuite_stdout_vlog(const struct sieve_error_params *params, } static void ATTR_FORMAT(4, 0) -_testsuite_log_verror(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) +_testsuite_logv(struct sieve_error_handler *ehandler ATTR_UNUSED, + const struct sieve_error_params *params, + enum sieve_error_flags flags ATTR_UNUSED, + const char *fmt, va_list args) { pool_t pool = _testsuite_logmsg_pool; struct _testsuite_log_message msg; + const char *prefix; - _testsuite_stdout_vlog(params, "error", fmt, args); + switch (params->log_type) { + case LOG_TYPE_ERROR: + prefix = "error"; + break; + case LOG_TYPE_WARNING: + prefix = "warning"; + break; + case LOG_TYPE_INFO: + prefix = "info"; + break; + case LOG_TYPE_DEBUG: + prefix = "debug"; + break; + default: + i_unreached(); + } + + _testsuite_stdout_vlog(params, prefix, fmt, args); msg.location = p_strdup(pool, params->location); msg.message = p_strdup_vprintf(pool, fmt, args); - array_append(&_testsuite_log_errors, &msg, 1); + switch (params->log_type) { + case LOG_TYPE_ERROR: + array_append(&_testsuite_log_errors, &msg, 1); + break; + case LOG_TYPE_WARNING: + array_append(&_testsuite_log_warnings, &msg, 1); + break; + case LOG_TYPE_INFO: + array_append(&_testsuite_log_messages, &msg, 1); + break; + case LOG_TYPE_DEBUG: + break; + default: + i_unreached(); + } } static void ATTR_FORMAT(4, 0) -_testsuite_log_main_verror(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) +_testsuite_main_logv(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + enum sieve_error_flags flags, + const char *fmt, va_list args) { + if (params->log_type != LOG_TYPE_ERROR) + return _testsuite_logv(ehandler, params, flags, fmt, args); + if (params->location == NULL || *params->location == '\0') { fprintf(stderr, "error: %s\n", t_strdup_vprintf(fmt, args)); @@ -87,49 +122,6 @@ _testsuite_log_main_verror(struct sieve_error_handler *ehandler ATTR_UNUSED, } } -static void ATTR_FORMAT(4, 0) -_testsuite_log_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - pool_t pool = _testsuite_logmsg_pool; - struct _testsuite_log_message msg; - - _testsuite_stdout_vlog(params, "warning", fmt, args); - - msg.location = p_strdup(pool, params->location); - msg.message = p_strdup_vprintf(pool, fmt, args); - - array_append(&_testsuite_log_warnings, &msg, 1); -} - -static void ATTR_FORMAT(4, 0) -_testsuite_log_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - pool_t pool = _testsuite_logmsg_pool; - struct _testsuite_log_message msg; - - _testsuite_stdout_vlog(params, "info", fmt, args); - - msg.location = p_strdup(pool, params->location); - msg.message = p_strdup_vprintf(pool, fmt, args); - - array_append(&_testsuite_log_messages, &msg, 1); -} - -static void ATTR_FORMAT(4, 0) -_testsuite_log_vdebug(struct sieve_error_handler *ehandler ATTR_UNUSED, - const struct sieve_error_params *params, - unsigned int flags ATTR_UNUSED, - const char *fmt, va_list args) -{ - _testsuite_stdout_vlog(params, "debug", fmt, args); -} - static struct sieve_error_handler *_testsuite_log_ehandler_create(void) { pool_t pool; @@ -140,10 +132,7 @@ static struct sieve_error_handler *_testsuite_log_ehandler_create(void) ehandler = p_new(pool, struct sieve_error_handler, 1); sieve_error_handler_init(ehandler, testsuite_sieve_instance, pool, 0); - ehandler->verror = _testsuite_log_verror; - ehandler->vwarning = _testsuite_log_vwarning; - ehandler->vinfo = _testsuite_log_vinfo; - ehandler->vdebug = _testsuite_log_vdebug; + ehandler->logv = _testsuite_logv; return ehandler; } @@ -158,10 +147,7 @@ static struct sieve_error_handler *_testsuite_log_main_ehandler_create(void) ehandler = p_new(pool, struct sieve_error_handler, 1); sieve_error_handler_init(ehandler, testsuite_sieve_instance, pool, 0); - ehandler->verror = _testsuite_log_main_verror; - ehandler->vwarning = _testsuite_log_vwarning; - ehandler->vinfo = _testsuite_log_vinfo; - ehandler->vdebug = _testsuite_log_vdebug; + ehandler->logv = _testsuite_main_logv; return ehandler; }