diff --git a/src/lib-sieve/sieve-error-private.h b/src/lib-sieve/sieve-error-private.h index a0fd36c4e2c031e741e11a48490bcb11b16545c5..b9caee5f2e4ccb28952c22cde939d3123d4dfb70 100644 --- a/src/lib-sieve/sieve-error-private.h +++ b/src/lib-sieve/sieve-error-private.h @@ -43,17 +43,21 @@ struct sieve_error_handler { bool log_debug; void (*verror)(struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(4, 0); + 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, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(4, 0);; + 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, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(4, 0);; + 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, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(4, 0);; + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, va_list args) + ATTR_FORMAT(4, 0); void (*free)(struct sieve_error_handler *ehandler); }; @@ -72,70 +76,74 @@ void sieve_error_handler_init_from_parent(struct sieve_error_handler *ehandler, void sieve_direct_verror(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(5, 0); + 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, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(5, 0); + 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, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(5, 0); + 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, - unsigned int flags, const char *location, - const char *fmt, va_list args) ATTR_FORMAT(5, 0); + 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, - unsigned int flags, const char *location, - const char *fmt, ...) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_direct_verror(svinst, ehandler, flags, location, fmt, args); + 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, - unsigned int flags, const char *location, - const char *fmt, ...) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_direct_vwarning(svinst, ehandler, flags, location, fmt, args); + 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, - unsigned int flags, const char *location, - const char *fmt, ...) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_direct_vinfo(svinst, ehandler, flags, location, fmt, args); + sieve_direct_vinfo(svinst, ehandler, params, flags, fmt, args); va_end(args); } static inline void ATTR_FORMAT(5, 6) sieve_direct_debug(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, ...) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, ...) { va_list args; va_start(args, fmt); - sieve_direct_vdebug(svinst, ehandler, flags, location, fmt, args); + sieve_direct_vdebug(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 e25c813520f94bce1f94f9d14fd58557c2a22f5c..5bb67a4b80ad293ee5333ffb5edc8e0529c70be6 100644 --- a/src/lib-sieve/sieve-error.c +++ b/src/lib-sieve/sieve-error.c @@ -74,7 +74,8 @@ void sieve_errors_deinit(struct sieve_instance *svinst) void sieve_direct_verror(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, va_list args) { if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 && @@ -88,14 +89,14 @@ void sieve_direct_verror(struct sieve_instance *svinst, if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) { if (svinst->system_ehandler->vinfo != NULL) { svinst->system_ehandler->vinfo( - svinst->system_ehandler, 0, - location, fmt, args_copy); + svinst->system_ehandler, + params, 0, fmt, args_copy); } } else { if (svinst->system_ehandler->verror != NULL) { svinst->system_ehandler->verror( - svinst->system_ehandler, 0, - location, fmt, args_copy); + svinst->system_ehandler, + params, 0, fmt, args_copy); } } va_end(args_copy); @@ -110,7 +111,7 @@ void sieve_direct_verror(struct sieve_instance *svinst, if (ehandler->parent != NULL || sieve_errors_more_allowed(ehandler)) { if (ehandler->verror != NULL) - ehandler->verror(ehandler, flags, location, fmt, args); + ehandler->verror(ehandler, params, flags, fmt, args); if (ehandler->pool != NULL) ehandler->errors++; @@ -119,8 +120,8 @@ void sieve_direct_verror(struct sieve_instance *svinst, void sieve_direct_vwarning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) + 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)) { @@ -133,14 +134,14 @@ void sieve_direct_vwarning(struct sieve_instance *svinst, if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) { if (svinst->system_ehandler->vinfo != NULL) { svinst->system_ehandler->vinfo( - svinst->system_ehandler, 0, - location, fmt, args_copy); + svinst->system_ehandler, + params, 0, fmt, args_copy); } } else { if (svinst->system_ehandler->vwarning != NULL) { svinst->system_ehandler->vwarning( - svinst->system_ehandler, 0, - location, fmt, args_copy); + svinst->system_ehandler, + params, 0, fmt, args_copy); } } va_end(args_copy); @@ -154,7 +155,7 @@ void sieve_direct_vwarning(struct sieve_instance *svinst, return; if (ehandler->vwarning != NULL) - ehandler->vwarning(ehandler, flags, location, fmt, args); + ehandler->vwarning(ehandler, params, flags, fmt, args); if (ehandler->pool != NULL) ehandler->warnings++; @@ -162,8 +163,8 @@ void sieve_direct_vwarning(struct sieve_instance *svinst, void sieve_direct_vinfo(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) + 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) && @@ -174,7 +175,7 @@ void sieve_direct_vinfo(struct sieve_instance *svinst, VA_COPY(args_copy, args); svinst->system_ehandler->vinfo( - svinst->system_ehandler, 0, location, + svinst->system_ehandler, params, 0, fmt, args_copy); va_end(args_copy); } @@ -185,14 +186,14 @@ void sieve_direct_vinfo(struct sieve_instance *svinst, if (ehandler->parent != NULL || ehandler->log_info) { if (ehandler->vinfo != NULL) - ehandler->vinfo(ehandler, flags, location, fmt, args); + ehandler->vinfo(ehandler, params, flags, fmt, args); } } void sieve_direct_vdebug(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) + 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) && @@ -203,7 +204,7 @@ void sieve_direct_vdebug(struct sieve_instance *svinst, VA_COPY(args_copy, args); svinst->system_ehandler->vdebug( - svinst->system_ehandler, 0, location, + svinst->system_ehandler, params, 0, fmt, args_copy); va_end(args_copy); } @@ -214,7 +215,7 @@ void sieve_direct_vdebug(struct sieve_instance *svinst, if (ehandler->parent != NULL || ehandler->log_debug) { if (ehandler->vdebug != NULL) - ehandler->vdebug(ehandler, flags, location, fmt, args); + ehandler->vdebug(ehandler, params, flags, fmt, args); } } @@ -243,59 +244,63 @@ sieve_system_ehandler_get(struct sieve_instance *svinst) void sieve_global_verror(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - const char *location, const char *fmt, va_list args) + const struct sieve_error_params *params, + const char *fmt, va_list args) { - sieve_direct_verror(svinst, ehandler, SIEVE_ERROR_FLAG_GLOBAL, - location, fmt, 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 char *location, const char *fmt, va_list args) + const struct sieve_error_params *params, + const char *fmt, va_list args) { - sieve_direct_vwarning(svinst, ehandler, SIEVE_ERROR_FLAG_GLOBAL, - location, fmt, 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 char *location, const char *fmt, va_list args) + const struct sieve_error_params *params, + const char *fmt, va_list args) { - sieve_direct_vinfo(svinst, ehandler, SIEVE_ERROR_FLAG_GLOBAL, - location, fmt, 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 char *location, + const struct sieve_error_params *params, const char *fmt, va_list args) { - sieve_direct_verror(svinst, ehandler, + sieve_direct_verror(svinst, ehandler, params, (SIEVE_ERROR_FLAG_GLOBAL | - SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), - location, fmt, args); + SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args); } void sieve_global_info_vwarning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - const char *location, + const struct sieve_error_params *params, const char *fmt, va_list args) { - sieve_direct_vwarning(svinst, ehandler, + sieve_direct_vwarning(svinst, ehandler, params, (SIEVE_ERROR_FLAG_GLOBAL | - SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), - location, fmt, args); + SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args); } void sieve_global_error(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_verror(svinst, ehandler, location, fmt, args); + sieve_global_verror(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -305,11 +310,14 @@ void sieve_global_warning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_vwarning(svinst, ehandler, location, fmt, args); + sieve_global_vwarning(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -319,11 +327,14 @@ void sieve_global_info(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_vinfo(svinst, ehandler, location, fmt, args); + sieve_global_vinfo(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -333,11 +344,14 @@ void sieve_global_info_error(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_info_verror(svinst, ehandler, location, fmt, args); + sieve_global_info_verror(svinst, ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -347,11 +361,14 @@ void sieve_global_info_warning(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_global_info_vwarning(svinst, ehandler, location, + sieve_global_info_vwarning(svinst, ehandler, ¶ms, fmt, args); } T_END; @@ -365,6 +382,9 @@ void sieve_global_info_warning(struct sieve_instance *svinst, void sieve_internal_error(struct sieve_error_handler *ehandler, const char *location, const char *user_prefix) { + struct sieve_error_params params = { + .location = location, + }; char str[256]; const char *msg; struct tm *tm; @@ -377,69 +397,71 @@ 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, 0, location, + sieve_direct_error(ehandler->svinst, ehandler, ¶ms, 0, "%s", msg); } else { - sieve_direct_error(ehandler->svinst, ehandler, 0, location, + sieve_direct_error(ehandler->svinst, ehandler, ¶ms, 0, "%s: %s", user_prefix, msg); } } -void sieve_verror(struct sieve_error_handler *ehandler, const char *location, +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, 0, location, fmt, args); + sieve_direct_verror(ehandler->svinst, ehandler, params, 0, fmt, args); } -void sieve_vwarning(struct sieve_error_handler *ehandler, const char *location, +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, 0, location, fmt, args); + sieve_direct_vwarning(ehandler->svinst, ehandler, params, 0, fmt, args); } -void sieve_vinfo(struct sieve_error_handler *ehandler, const char *location, +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, 0, location, fmt, args); + sieve_direct_vinfo(ehandler->svinst, ehandler, params, 0, fmt, args); } -void sieve_vdebug(struct sieve_error_handler *ehandler, const char *location, +void sieve_vdebug(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, 0, location, fmt, args); + sieve_direct_vdebug(ehandler->svinst, ehandler, params, 0, fmt, args); } void sieve_vcritical(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, const char *location, + struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, const char *user_prefix, const char *fmt, va_list args) { - if (location == NULL || *location == '\0') { - sieve_direct_verror(svinst, svinst->system_ehandler, - 0, NULL, fmt, args); - } else { - sieve_direct_verror(svinst, svinst->system_ehandler, - 0, location, fmt, args); - } - - sieve_internal_error(ehandler, location, user_prefix); + sieve_direct_verror(svinst, svinst->system_ehandler, params, 0, + fmt, args); + sieve_internal_error(ehandler, params->location, user_prefix); } void sieve_error(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_verror(ehandler, location, fmt, args); + sieve_verror(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -448,11 +470,14 @@ void sieve_error(struct sieve_error_handler *ehandler, const char *location, void sieve_warning(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vwarning(ehandler, location, fmt, args); + sieve_vwarning(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -461,11 +486,14 @@ void sieve_warning(struct sieve_error_handler *ehandler, const char *location, void sieve_info(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vinfo(ehandler, location, fmt, args); + sieve_vinfo(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -474,11 +502,14 @@ void sieve_info(struct sieve_error_handler *ehandler, const char *location, void sieve_debug(struct sieve_error_handler *ehandler, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vdebug(ehandler, location, fmt, args); + sieve_vdebug(ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -488,11 +519,14 @@ 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_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vcritical(svinst, ehandler, location, user_prefix, + sieve_vcritical(svinst, ehandler, ¶ms, user_prefix, fmt, args); } T_END; @@ -635,7 +669,8 @@ 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, - master_log_func_t log_func, const char *location, + const struct sieve_error_params *params, + master_log_func_t log_func, const char *fmt, va_list args) { struct sieve_master_ehandler *ehandler = @@ -648,8 +683,8 @@ sieve_master_vlog(struct sieve_error_handler *_ehandler, str_append(str, "sieve: "); - if (location != NULL && *location != '\0') - str_printfa(str, "%s: ", location); + if (params->location != NULL && *params->location != '\0') + str_printfa(str, "%s: ", params->location); str_vprintfa(str, fmt, args); @@ -658,34 +693,38 @@ sieve_master_vlog(struct sieve_error_handler *_ehandler, static void ATTR_FORMAT(4, 0) sieve_master_verror(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_master_vlog(ehandler, i_error, location, fmt, 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, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_master_vlog(ehandler, i_warning, location, fmt, 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, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_master_vlog(ehandler, i_info, location, fmt, 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, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_master_vlog(ehandler, i_debug, location, fmt, args); + sieve_master_vlog(ehandler, params, i_debug, fmt, args); } struct sieve_error_handler * @@ -720,48 +759,52 @@ 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 char *prefix, const char *location, - const char *fmt, va_list args) + const struct sieve_error_params *params, + const char *prefix, const char *fmt, va_list args) { - if (location == NULL || *location == '\0') { + if (params->location == NULL || *params->location == '\0') { fprintf(stderr, "%s: %s.\n", prefix, t_strdup_vprintf(fmt, args)); } else { - fprintf(stderr, "%s: %s: %s.\n", location, prefix, + fprintf(stderr, "%s: %s: %s.\n", params->location, prefix, t_strdup_vprintf(fmt, args)); } } static void ATTR_FORMAT(4, 0) sieve_stderr_verror(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_stderr_vmessage(ehandler, "error", location, fmt, args); + sieve_stderr_vmessage(ehandler, params, "error", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_stderr_vwarning(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_stderr_vmessage(ehandler, "warning", location, fmt, args); + sieve_stderr_vmessage(ehandler, params, "warning", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_stderr_vinfo(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_stderr_vmessage(ehandler, "info", location, fmt, args); + sieve_stderr_vmessage(ehandler, params, "info", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_stderr_vdebug(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_stderr_vmessage(ehandler, "debug", location, fmt, args); + sieve_stderr_vmessage(ehandler, params, "debug", fmt, args); } struct sieve_error_handler * @@ -800,14 +843,15 @@ struct sieve_strbuf_ehandler { }; static void ATTR_FORMAT(4, 0) -sieve_strbuf_vmessage(struct sieve_error_handler *ehandler, const char *prefix, - const char *location, const char *fmt, va_list args) +sieve_strbuf_vmessage(struct sieve_error_handler *ehandler, + const struct sieve_error_params *params, + const char *prefix, const char *fmt, va_list args) { struct sieve_strbuf_ehandler *handler = (struct sieve_strbuf_ehandler *) ehandler; - if (location != NULL && *location != '\0') - str_printfa(handler->errors, "%s: ", location); + if (params->location != NULL && *params->location != '\0') + str_printfa(handler->errors, "%s: ", params->location); str_printfa(handler->errors, "%s: ", prefix); str_vprintfa(handler->errors, fmt, args); @@ -819,34 +863,38 @@ sieve_strbuf_vmessage(struct sieve_error_handler *ehandler, const char *prefix, static void ATTR_FORMAT(4, 0) sieve_strbuf_verror(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_strbuf_vmessage(ehandler, "error", location, fmt, args); + sieve_strbuf_vmessage(ehandler, params, "error", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_strbuf_vwarning(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_strbuf_vmessage(ehandler, "warning", location, fmt, args); + sieve_strbuf_vmessage(ehandler, params, "warning", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_strbuf_vinfo(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_strbuf_vmessage(ehandler, "info", location, fmt, args); + sieve_strbuf_vmessage(ehandler, params, "info", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_strbuf_vdebug(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - sieve_strbuf_vmessage(ehandler, "debug", location, fmt, args); + sieve_strbuf_vmessage(ehandler, params, "debug", fmt, args); } struct sieve_error_handler * @@ -889,8 +937,8 @@ struct sieve_logfile_ehandler { static void ATTR_FORMAT(4, 0) sieve_logfile_vprintf(struct sieve_logfile_ehandler *ehandler, - const char *location, const char *prefix, - const char *fmt, va_list args) + const struct sieve_error_params *params, + const char *prefix, const char *fmt, va_list args) { string_t *outbuf; ssize_t ret = 0, remain; @@ -901,8 +949,8 @@ sieve_logfile_vprintf(struct sieve_logfile_ehandler *ehandler, T_BEGIN { outbuf = t_str_new(256); - if (location != NULL && *location != '\0') - str_printfa(outbuf, "%s: ", location); + if (params->location != NULL && *params->location != '\0') + str_printfa(outbuf, "%s: ", params->location); str_printfa(outbuf, "%s: ", prefix); str_vprintfa(outbuf, fmt, args); str_append(outbuf, ".\n"); @@ -932,10 +980,13 @@ sieve_logfile_printf(struct sieve_logfile_ehandler *ehandler, const char *location, const char *prefix, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); - sieve_logfile_vprintf(ehandler, location, prefix, fmt, args); + sieve_logfile_vprintf(ehandler, ¶ms, prefix, fmt, args); va_end(args); } @@ -1066,7 +1117,8 @@ static void sieve_logfile_start(struct sieve_logfile_ehandler *ehandler) static void ATTR_FORMAT(4, 0) sieve_logfile_verror(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { struct sieve_logfile_ehandler *handler = @@ -1075,12 +1127,13 @@ sieve_logfile_verror(struct sieve_error_handler *ehandler, if (!handler->started) sieve_logfile_start(handler); - sieve_logfile_vprintf(handler, location, "error", fmt, args); + sieve_logfile_vprintf(handler, params, "error", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_logfile_vwarning(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { struct sieve_logfile_ehandler *handler = @@ -1089,12 +1142,13 @@ sieve_logfile_vwarning(struct sieve_error_handler *ehandler, if (!handler->started) sieve_logfile_start(handler); - sieve_logfile_vprintf(handler, location, "warning", fmt, args); + sieve_logfile_vprintf(handler, params, "warning", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_logfile_vinfo(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { struct sieve_logfile_ehandler *handler = @@ -1103,12 +1157,13 @@ sieve_logfile_vinfo(struct sieve_error_handler *ehandler, if (!handler->started) sieve_logfile_start(handler); - sieve_logfile_vprintf(handler, location, "info", fmt, args); + sieve_logfile_vprintf(handler, params, "info", fmt, args); } static void ATTR_FORMAT(4, 0) sieve_logfile_vdebug(struct sieve_error_handler *ehandler, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { struct sieve_logfile_ehandler *handler = @@ -1117,7 +1172,7 @@ sieve_logfile_vdebug(struct sieve_error_handler *ehandler, if (!handler->started) sieve_logfile_start(handler); - sieve_logfile_vprintf(handler, location, "debug", fmt, args); + sieve_logfile_vprintf(handler, params, "debug", fmt, args); } static void sieve_logfile_free(struct sieve_error_handler *ehandler) @@ -1183,66 +1238,83 @@ struct sieve_prefix_ehandler { }; static const char *ATTR_FORMAT(3, 0) -_prefix_message(struct sieve_prefix_ehandler *ehandler, const char *location, +_prefix_message(struct sieve_prefix_ehandler *ehandler, + const struct sieve_error_params *params, const char *fmt, va_list args) { string_t *str = t_str_new(256); if (ehandler->prefix != NULL) str_printfa(str, "%s: ", ehandler->prefix); - if (location != NULL) - str_printfa(str, "%s: ", location); + if (params->location != NULL && *params->location != '\0') + str_printfa(str, "%s: ", params->location); str_vprintfa(str, fmt, args); return str_c(str); } static void ATTR_FORMAT(4, 0) -sieve_prefix_verror(struct sieve_error_handler *_ehandler, unsigned int flags, - const char *location, const char *fmt, va_list args) +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, flags, - ehandler->location, "%s", - _prefix_message(ehandler, location, fmt, args)); + 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, unsigned int flags, - const char *location, const char *fmt, va_list args) +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, flags, - ehandler->location, "%s", - _prefix_message(ehandler, location, fmt, args)); + 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, unsigned int flags, - const char *location, const char *fmt, va_list args) +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; - sieve_direct_info(_ehandler->svinst, _ehandler->parent, flags, - ehandler->location, "%s", - _prefix_message(ehandler, location, fmt, args)); + 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, unsigned int flags, - const char *location, const char *fmt, va_list args) +sieve_prefix_vdebug(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_debug(_ehandler->svinst, _ehandler->parent, flags, - ehandler->location, "%s", - _prefix_message(ehandler, location, fmt, args)); + sieve_direct_debug(_ehandler->svinst, _ehandler->parent, + &new_params, flags, "%s", + _prefix_message(ehandler, params, fmt, args)); } struct sieve_error_handler * @@ -1285,7 +1357,8 @@ struct sieve_varexpand_ehandler { }; static const char *ATTR_FORMAT(3, 0) -_expand_message(struct sieve_error_handler *_ehandler, const char *location, +_expand_message(struct sieve_error_handler *_ehandler, + const struct sieve_error_params *params, const char *fmt, va_list args) { struct sieve_varexpand_ehandler *ehandler = @@ -1299,7 +1372,7 @@ _expand_message(struct sieve_error_handler *_ehandler, const char *location, /* Fill in substitution items */ table[0].value = t_strdup_vprintf(fmt, args); - table[1].value = location; + table[1].value = params->location; /* Expand variables */ if (var_expand(str, ehandler->format, table, &error) <= 0 && @@ -1317,42 +1390,42 @@ _expand_message(struct sieve_error_handler *_ehandler, const char *location, static void ATTR_FORMAT(4, 0) sieve_varexpand_verror(struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, va_list args) { sieve_direct_error(ehandler->svinst, ehandler->parent, - flags, location, "%s", - _expand_message(ehandler, location, fmt, args)); + params, flags, "%s", + _expand_message(ehandler, params, fmt, args)); } static void ATTR_FORMAT(4, 0) sieve_varexpand_vwarning(struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, va_list args) { sieve_direct_warning(ehandler->svinst, ehandler->parent, - flags, location, "%s", - _expand_message(ehandler, location, fmt, args)); + params, flags, "%s", + _expand_message(ehandler, params, fmt, args)); } static void ATTR_FORMAT(4, 0) sieve_varexpand_vinfo(struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, va_list args) { sieve_direct_info(ehandler->svinst, ehandler->parent, - flags, location, "%s", - _expand_message(ehandler, location, fmt, args)); + params, flags, "%s", + _expand_message(ehandler, params, fmt, args)); } static void ATTR_FORMAT(4, 0) sieve_varexpand_vdebug(struct sieve_error_handler *ehandler, - unsigned int flags, const char *location, - const char *fmt, va_list args) + const struct sieve_error_params *params, + unsigned int flags, const char *fmt, va_list args) { sieve_direct_debug(ehandler->svinst, ehandler->parent, - flags, location, "%s", - _expand_message(ehandler, location, fmt, args)); + params, flags, "%s", + _expand_message(ehandler, params, fmt, args)); } struct sieve_error_handler * diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h index ef7d4119d4ae720e02659a5116018db0484ac184..19dc0ce0e24c0da8b53d5e84934c02b95c6d32d8 100644 --- a/src/lib-sieve/sieve-error.h +++ b/src/lib-sieve/sieve-error.h @@ -20,8 +20,13 @@ struct sieve_error_handler; * Types */ +struct sieve_error_params { + /* Location in Sieve source script */ + const char *location; +}; + typedef void (*sieve_error_vfunc_t)(struct sieve_error_handler *ehandler, - const char *location, + 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, @@ -42,23 +47,23 @@ sieve_system_ehandler_get(struct sieve_instance *svinst); void sieve_global_verror(struct sieve_instance *svinst, struct sieve_error_handler *ehandler, - const char *location, + 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 char *location, + 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 char *location, + 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 char *location, + 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 char *location, + const struct sieve_error_params *params, const char *fmt, va_list args) ATTR_FORMAT(4, 0); @@ -95,16 +100,21 @@ const char * sieve_error_script_location(const struct sieve_script *script, unsigned int source_line); -void sieve_verror(struct sieve_error_handler *ehandler, const char *location, +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 char *location, +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 char *location, +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 char *location, +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_vcritical(struct sieve_instance *svinst, - struct sieve_error_handler *ehandler, const char *location, + 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); diff --git a/src/lib-sieve/sieve-generator.c b/src/lib-sieve/sieve-generator.c index 8eb016e0db237a5558e4a015a4cb753c1df3ec9f..4546201f5196a70001be4edeb7e526cd3a9b44a3 100644 --- a/src/lib-sieve/sieve-generator.c +++ b/src/lib-sieve/sieve-generator.c @@ -513,35 +513,47 @@ sieve_generator_run(struct sieve_generator *gentr, void sieve_generator_error(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; + params.location = + sieve_error_script_location(gentr->genenv.script, source_line); + va_start(args, fmt); - sieve_verror(gentr->ehandler, - sieve_error_script_location(gentr->genenv.script, source_line), - fmt, args); + sieve_verror(gentr->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_generator_warning(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; + params.location = + sieve_error_script_location(gentr->genenv.script, source_line); + va_start(args, fmt); - sieve_vwarning(gentr->ehandler, - sieve_error_script_location(gentr->genenv.script, source_line), - fmt, args); + sieve_vwarning(gentr->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_generator_critical(struct sieve_generator *gentr, unsigned int source_line, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; + params.location = + sieve_error_script_location(gentr->genenv.script, source_line); + va_start(args, fmt); - sieve_vwarning(gentr->ehandler, - sieve_error_script_location(gentr->genenv.script, source_line), - fmt, args); + sieve_vwarning(gentr->ehandler, ¶ms, fmt, args); va_end(args); } diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 99ed58efc9f8d4b5dbf9b7dcf627897fcb7b5038..5614e251f36e694dc6a16ccaff72047d37869186 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -947,46 +947,59 @@ int sieve_interpreter_run(struct sieve_interpreter *interp, * Error handling */ -static inline void -sieve_runtime_vmsg(const struct sieve_runtime_env *renv, - sieve_error_vfunc_t msg_func, const char *location, - const char *fmt, va_list args) +static inline void ATTR_FORMAT(4, 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) { + struct sieve_error_params new_params = *params; + T_BEGIN { - if (location == NULL) - location = sieve_runtime_get_full_command_location(renv); + if (new_params.location == NULL) { + new_params.location = + sieve_runtime_get_full_command_location(renv); + } - msg_func(renv->ehandler, location, fmt, args); + msg_func(renv->ehandler, params, fmt, args); } T_END; } void sieve_runtime_error(const struct sieve_runtime_env *renv, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); - sieve_runtime_vmsg(renv, sieve_verror, location, fmt, args); + sieve_runtime_logv(renv, ¶ms, sieve_verror, fmt, args); va_end(args); } void sieve_runtime_warning(const struct sieve_runtime_env *renv, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); - sieve_runtime_vmsg(renv, sieve_vwarning, location, fmt, args); + sieve_runtime_logv(renv, ¶ms, sieve_vwarning, fmt, args); va_end(args); } void sieve_runtime_log(const struct sieve_runtime_env *renv, const char *location, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); - sieve_runtime_vmsg(renv, sieve_vinfo, location, fmt, args); + sieve_runtime_logv(renv, ¶ms, sieve_vinfo, fmt, args); va_end(args); } @@ -994,15 +1007,20 @@ void sieve_runtime_critical(const struct sieve_runtime_env *renv, const char *location, const char *user_prefix, const char *fmt, ...) { + struct sieve_error_params params = { + .location = location, + }; va_list args; va_start(args, fmt); T_BEGIN { - if (location == NULL) - location = sieve_runtime_get_full_command_location(renv); + if (params.location == NULL) { + params.location = + sieve_runtime_get_full_command_location(renv); + } - sieve_vcritical(renv->svinst, renv->ehandler, location, + sieve_vcritical(renv->svinst, renv->ehandler, ¶ms, user_prefix, fmt, args); } T_END; diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c index f20b4ef95c49cfc4bd2bf07cd76129726677f842..30678b71cf6bbd5d73ab45cf72cfb905b1031cc0 100644 --- a/src/lib-sieve/sieve-lexer.c +++ b/src/lib-sieve/sieve-lexer.c @@ -124,15 +124,18 @@ inline static void ATTR_FORMAT(2, 3) 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, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_verror(scanner->ehandler, - sieve_error_script_location( - scanner->script, scanner->current_line), - fmt, args); + params.location = + sieve_error_script_location(scanner->script, + scanner->current_line); + sieve_verror(scanner->ehandler, ¶ms, fmt, args); } T_END; va_end(args); @@ -142,15 +145,18 @@ inline static void ATTR_FORMAT(2, 3) 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, + }; va_list args; va_start(args, fmt); T_BEGIN { - sieve_vwarning(scanner->ehandler, - sieve_error_script_location( - scanner->script, scanner->current_line), - fmt, args); + params.location = + sieve_error_script_location(scanner->script, + scanner->current_line); + sieve_vwarning(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 82eaa59922549284ca010700c52912e9b7d2d6b1..dfe67c550900ab74fce190aaa715b72a565a4e6b 100644 --- a/src/lib-sieve/sieve-parser.c +++ b/src/lib-sieve/sieve-parser.c @@ -91,6 +91,9 @@ void sieve_parser_free(struct sieve_parser **parser) inline static void ATTR_FORMAT(2, 3) sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); @@ -98,10 +101,10 @@ sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...) /* Don't report a parse error if the lexer complained already */ if (sieve_lexer_token_type(parser->lexer) != STT_ERROR) { T_BEGIN { - sieve_verror(parser->ehandler, - sieve_error_script_location(parser->script, - sieve_lexer_token_line(parser->lexer)), - fmt, args); + params.location = sieve_error_script_location( + parser->script, + sieve_lexer_token_line(parser->lexer)); + sieve_verror(parser->ehandler, ¶ms, fmt, args); } T_END; } diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index f37bb476f1e1f52686ec81f229d14ede9818a75a..184eada5b72aefdb48bb6a39b747a6d2c60a7a1f 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -1533,80 +1533,106 @@ 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, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_verror(aenv->ehandler, NULL, fmt, args); + sieve_verror(aenv->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_result_global_error(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_global_verror(aenv->svinst, aenv->ehandler, NULL, fmt, args); + sieve_global_verror(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_result_warning(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_vwarning(aenv->ehandler, NULL, fmt, args); + sieve_vwarning(aenv->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_result_global_warning(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_global_vwarning(aenv->svinst, aenv->ehandler, NULL, fmt, args); + sieve_global_vwarning(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_result_log(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_vinfo(aenv->ehandler, NULL, fmt, args); + sieve_vinfo(aenv->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_result_global_log(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_global_vinfo(aenv->svinst, aenv->ehandler, NULL, fmt, args); + sieve_global_vinfo(aenv->svinst, aenv->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_global_info_verror(aenv->svinst, aenv->ehandler, NULL, fmt, args); + sieve_global_info_verror(aenv->svinst, aenv->ehandler, ¶ms, + fmt, args); va_end(args); } void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; va_start(args, fmt); - sieve_global_info_vwarning(aenv->svinst, aenv->ehandler, NULL, fmt, args); + sieve_global_info_vwarning(aenv->svinst, aenv->ehandler, ¶ms, + fmt, args); va_end(args); } diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c index 017dc4fa5602ceff1b7d7d09d251136a36dabbd0..cc49bb610fc72d738c4093b2dd35fb2958de717f 100644 --- a/src/lib-sieve/sieve-validator.c +++ b/src/lib-sieve/sieve-validator.c @@ -1662,24 +1662,32 @@ sieve_validator_object_registry_init(struct sieve_validator *valdtr, void sieve_validator_error(struct sieve_validator *valdtr, unsigned int source_line, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; + params.location = + sieve_error_script_location(valdtr->script, source_line); + va_start(args, fmt); - sieve_verror(valdtr->ehandler, - sieve_error_script_location(valdtr->script, source_line), - fmt, args); + sieve_verror(valdtr->ehandler, ¶ms, fmt, args); va_end(args); } void sieve_validator_warning(struct sieve_validator *valdtr, unsigned int source_line, const char *fmt, ...) { + struct sieve_error_params params = { + .location = NULL, + }; va_list args; + params.location = + sieve_error_script_location(valdtr->script, source_line); + va_start(args, fmt); - sieve_vwarning(valdtr->ehandler, - sieve_error_script_location(valdtr->script, source_line), - fmt, args); + sieve_vwarning(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 8975bc8b3d12acbdebb28777e97850434514d0df..98669a81d299ced82ce2afcbe1ae8059326e570a 100644 --- a/src/plugins/lda-sieve/lda-sieve-log.c +++ b/src/plugins/lda-sieve/lda-sieve-log.c @@ -41,38 +41,42 @@ 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, unsigned int flags, - const char *location, const char *fmt, va_list args) +lda_sieve_log_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, - flags, location, "%s", + 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, unsigned int flags, - const char *location, const char *fmt, va_list args) +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, - flags, location, "%s", - lda_sieve_log_expand_message(ehandler, fmt, args)); + 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, unsigned int flags, - const char *location, const char *fmt, va_list args) +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, - flags, location, "%s", + 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, unsigned int flags, - const char *location, const char *fmt, va_list args) +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, - flags, location, "%s", + params, flags, "%s", lda_sieve_log_expand_message(ehandler, fmt, args)); } diff --git a/src/testsuite/testsuite-log.c b/src/testsuite/testsuite-log.c index 6ddbbad166407fa5f526059487ddd285326430ae..84ca4c55bcbc7c332fc747805291676cde34fd29 100644 --- a/src/testsuite/testsuite-log.c +++ b/src/testsuite/testsuite-log.c @@ -36,19 +36,20 @@ ARRAY(struct _testsuite_log_message) _testsuite_log_warnings; ARRAY(struct _testsuite_log_message) _testsuite_log_messages; static inline void ATTR_FORMAT(3, 0) -_testsuite_stdout_vlog(const char *prefix, const char *location, - const char *fmt, va_list args) +_testsuite_stdout_vlog(const struct sieve_error_params *params, + const char *prefix, const char *fmt, va_list args) { if (_testsuite_log_stdout) { va_list args_copy; VA_COPY(args_copy, args); - if (location == NULL || *location == '\0') { - fprintf(stdout, "LOG: %s: %s\n", prefix, - t_strdup_vprintf(fmt, args_copy)); + if (params->location == NULL || *params->location == '\0') { + fprintf(stdout, "LOG: %s: %s\n", + prefix, t_strdup_vprintf(fmt, args_copy)); } else { - fprintf(stdout, "LOG: %s: %s: %s\n", prefix, - location, t_strdup_vprintf(fmt, args_copy)); + fprintf(stdout, "LOG: %s: %s: %s\n", + prefix, params->location, + t_strdup_vprintf(fmt, args_copy)); } va_end(args_copy); } @@ -56,15 +57,16 @@ _testsuite_stdout_vlog(const char *prefix, const char *location, static void ATTR_FORMAT(4, 0) _testsuite_log_verror(struct sieve_error_handler *ehandler ATTR_UNUSED, - unsigned int flags ATTR_UNUSED, const char *location, + 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("error", location, fmt, args); + _testsuite_stdout_vlog(params, "error", fmt, args); - msg.location = p_strdup(pool, location); + msg.location = p_strdup(pool, params->location); msg.message = p_strdup_vprintf(pool, fmt, args); array_append(&_testsuite_log_errors, &msg, 1); @@ -72,29 +74,31 @@ _testsuite_log_verror(struct sieve_error_handler *ehandler ATTR_UNUSED, static void ATTR_FORMAT(4, 0) _testsuite_log_main_verror(struct sieve_error_handler *ehandler ATTR_UNUSED, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - if (location == NULL || *location == '\0') { + if (params->location == NULL || *params->location == '\0') { fprintf(stderr, "error: %s\n", t_strdup_vprintf(fmt, args)); } else { fprintf(stderr, "%s: error: %s\n", - location, t_strdup_vprintf(fmt, args)); + params->location, t_strdup_vprintf(fmt, args)); } } static void ATTR_FORMAT(4, 0) _testsuite_log_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED, - unsigned int flags ATTR_UNUSED, const char *location, + 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("warning", location, fmt, args); + _testsuite_stdout_vlog(params, "warning", fmt, args); - msg.location = p_strdup(pool, location); + msg.location = p_strdup(pool, params->location); msg.message = p_strdup_vprintf(pool, fmt, args); array_append(&_testsuite_log_warnings, &msg, 1); @@ -102,15 +106,16 @@ _testsuite_log_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED, static void ATTR_FORMAT(4, 0) _testsuite_log_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED, - unsigned int flags ATTR_UNUSED, const char *location, + 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("info", location, fmt, args); + _testsuite_stdout_vlog(params, "info", fmt, args); - msg.location = p_strdup(pool, location); + msg.location = p_strdup(pool, params->location); msg.message = p_strdup_vprintf(pool, fmt, args); array_append(&_testsuite_log_messages, &msg, 1); @@ -118,10 +123,11 @@ _testsuite_log_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED, static void ATTR_FORMAT(4, 0) _testsuite_log_vdebug(struct sieve_error_handler *ehandler ATTR_UNUSED, - unsigned int flags ATTR_UNUSED, const char *location, + const struct sieve_error_params *params, + unsigned int flags ATTR_UNUSED, const char *fmt, va_list args) { - _testsuite_stdout_vlog("debug", location, fmt, args); + _testsuite_stdout_vlog(params, "debug", fmt, args); } static struct sieve_error_handler *_testsuite_log_ehandler_create(void) @@ -164,28 +170,31 @@ static void ATTR_FORMAT(2, 0) testsuite_error_handler(const struct failure_context *ctx, const char *fmt, va_list args) { + struct sieve_error_params params = { + .location = NULL, + }; pool_t pool = _testsuite_logmsg_pool; struct _testsuite_log_message msg; i_zero(&msg); switch (ctx->type) { case LOG_TYPE_DEBUG: - _testsuite_stdout_vlog("debug", NULL, fmt, args); + _testsuite_stdout_vlog(¶ms, "debug", fmt, args); break; case LOG_TYPE_INFO: - _testsuite_stdout_vlog("info", NULL, fmt, args); + _testsuite_stdout_vlog(¶ms, "info", fmt, args); msg.message = p_strdup_vprintf(pool, fmt, args); array_append(&_testsuite_log_messages, &msg, 1); break; case LOG_TYPE_WARNING: - _testsuite_stdout_vlog("warning", NULL, fmt, args); + _testsuite_stdout_vlog(¶ms, "warning", fmt, args); msg.message = p_strdup_vprintf(pool, fmt, args); array_append(&_testsuite_log_warnings, &msg, 1); break; case LOG_TYPE_ERROR: - _testsuite_stdout_vlog("error", NULL, fmt, args); + _testsuite_stdout_vlog(¶ms, "error", fmt, args); msg.message = p_strdup_vprintf(pool, fmt, args); array_append(&_testsuite_log_errors, &msg, 1);