diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c index 083de9510c095c0fe6ee6df1a96ba5dab74e9b7e..166d530899a5356a22d99c0a23c404ed4e65d01f 100644 --- a/src/lib-sieve/sieve-error.c +++ b/src/lib-sieve/sieve-error.c @@ -53,7 +53,7 @@ const char *sieve_error_script_location void sieve_errors_init(struct sieve_instance *svinst) { - svinst->system_ehandler = sieve_master_ehandler_create(svinst, 0); + svinst->system_ehandler = sieve_master_ehandler_create(svinst, NULL, 0); } void sieve_errors_deinit(struct sieve_instance *svinst) @@ -259,6 +259,12 @@ void sieve_system_ehandler_set sieve_error_handler_ref(ehandler); } +struct sieve_error_handler *sieve_system_ehandler_get +(struct sieve_instance *svinst) +{ + return svinst->system_ehandler; +} + /* * User errors */ @@ -581,15 +587,42 @@ void sieve_error_handler_reset(struct sieve_error_handler *ehandler) * - Output errors directly to Dovecot master log */ +struct sieve_master_ehandler { + struct sieve_error_handler handler; + + const char *prefix; +}; + +typedef void (*master_log_func_t)(const char *fmt, ...) ATTR_FORMAT(1, 2); + +static void sieve_master_vlog +(struct sieve_error_handler *_ehandler, master_log_func_t log_func, + const char *location, const char *fmt, va_list args) +{ + struct sieve_master_ehandler *ehandler = + (struct sieve_master_ehandler *) _ehandler; + string_t *str; + + str = t_str_new(256); + if ( ehandler->prefix != NULL) + str_printfa(str, "%s: ", ehandler->prefix); + + str_append(str, "sieve: "); + + if ( location != NULL && *location != '\0' ) + str_printfa(str, "%s: ", location); + + str_vprintfa(str, fmt, args); + + log_func("%s", str_c(str)); +} + static void sieve_master_verror -(struct sieve_error_handler *ehandler ATTR_UNUSED, +(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED, const char *location, const char *fmt, va_list args) { - if ( location == NULL || *location == '\0' ) - i_error("sieve: %s", t_strdup_vprintf(fmt, args)); - else - i_error("sieve: %s: %s", location, t_strdup_vprintf(fmt, args)); + sieve_master_vlog(ehandler, i_error, location, fmt, args); } static void sieve_master_vwarning @@ -597,10 +630,7 @@ static void sieve_master_vwarning unsigned int flags ATTR_UNUSED, const char *location, const char *fmt, va_list args) { - if ( location == NULL || *location == '\0' ) - i_warning("sieve: %s", t_strdup_vprintf(fmt, args)); - else - i_warning("sieve: %s: %s", location, t_strdup_vprintf(fmt, args)); + sieve_master_vlog(ehandler, i_warning, location, fmt, args); } static void sieve_master_vinfo @@ -608,10 +638,7 @@ static void sieve_master_vinfo unsigned int flags ATTR_UNUSED, const char *location, const char *fmt, va_list args) { - if ( location == NULL || *location == '\0' ) - i_info("sieve: %s", t_strdup_vprintf(fmt, args)); - else - i_info("sieve: %s: %s", location, t_strdup_vprintf(fmt, args)); + sieve_master_vlog(ehandler, i_info, location, fmt, args); } static void sieve_master_vdebug @@ -619,32 +646,28 @@ static void sieve_master_vdebug unsigned int flags ATTR_UNUSED, const char *location, const char *fmt, va_list args) { - if ( location == NULL || *location == '\0' ) - i_debug("sieve: %s", t_strdup_vprintf(fmt, args)); - else - i_debug("sieve: %s: %s", location, t_strdup_vprintf(fmt, args)); + sieve_master_vlog(ehandler, i_debug, location, fmt, args); } struct sieve_error_handler *sieve_master_ehandler_create -(struct sieve_instance *svinst, unsigned int max_errors) +(struct sieve_instance *svinst, const char *prefix, unsigned int max_errors) { pool_t pool; - struct sieve_error_handler *ehandler; + struct sieve_master_ehandler *ehandler; - /* Pool is not strictly necessary, but other handler types will need - * a pool, so this one will have one too. - */ - pool = pool_alloconly_create - ("master_error_handler", sizeof(struct sieve_error_handler)); - ehandler = p_new(pool, struct sieve_error_handler, 1); - sieve_error_handler_init(ehandler, svinst, pool, max_errors); + pool = pool_alloconly_create("master_error_handler", 256); + ehandler = p_new(pool, struct sieve_master_ehandler, 1); + sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors); - ehandler->verror = sieve_master_verror; - ehandler->vwarning = sieve_master_vwarning; - ehandler->vinfo = sieve_master_vinfo; - ehandler->vdebug = sieve_master_vdebug; + ehandler->handler.verror = sieve_master_verror; + ehandler->handler.vwarning = sieve_master_vwarning; + ehandler->handler.vinfo = sieve_master_vinfo; + ehandler->handler.vdebug = sieve_master_vdebug; - return ehandler; + if ( prefix != NULL ) + ehandler->prefix = p_strdup(pool, prefix); + + return &ehandler->handler; } /* diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h index 36e8985b026b42e7b4c4602b005394f4b5b37164..d133ff8d05ee77912e746864a50a3510ce1b2a8d 100644 --- a/src/lib-sieve/sieve-error.h +++ b/src/lib-sieve/sieve-error.h @@ -54,6 +54,8 @@ void sieve_sys_debug void sieve_system_ehandler_set (struct sieve_error_handler *ehandler); +struct sieve_error_handler *sieve_system_ehandler_get + (struct sieve_instance *svinst); /* * Global (user+system) errors @@ -131,8 +133,6 @@ void sieve_error_handler_accept_infolog (struct sieve_error_handler *ehandler, bool enable); void sieve_error_handler_accept_debuglog (struct sieve_error_handler *ehandler, bool enable); -void sieve_error_handler_copy_masterlog - (struct sieve_error_handler *ehandler, bool enable); /* * Error handler statistics @@ -158,7 +158,7 @@ void sieve_error_handler_reset(struct sieve_error_handler *ehandler); /* Write errors to dovecot master log */ struct sieve_error_handler *sieve_master_ehandler_create - (struct sieve_instance *svinst, unsigned int max_errors); + (struct sieve_instance *svinst, const char *prefix, unsigned int max_errors); /* Write errors to stderr */ struct sieve_error_handler *sieve_stderr_ehandler_create diff --git a/src/plugins/lda-sieve/Makefile.am b/src/plugins/lda-sieve/Makefile.am index 9994a64de05055eb8747cd9b28a89f9b024ce6cd..b89ed4b437d150758f112f0a22e40d7429d53567 100644 --- a/src/plugins/lda-sieve/Makefile.am +++ b/src/plugins/lda-sieve/Makefile.am @@ -12,9 +12,7 @@ lib90_sieve_plugin_la_LIBADD = \ $(top_builddir)/src/lib-sieve/libdovecot-sieve.la lib90_sieve_plugin_la_SOURCES = \ - lda-sieve-log.c \ lda-sieve-plugin.c noinst_HEADERS = \ - lda-sieve-log.h \ lda-sieve-plugin.h diff --git a/src/plugins/lda-sieve/lda-sieve-log.c b/src/plugins/lda-sieve/lda-sieve-log.c deleted file mode 100644 index 482a88a90d4131955525206168d10c78a8c3e49b..0000000000000000000000000000000000000000 --- a/src/plugins/lda-sieve/lda-sieve-log.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (c) 2002-2010 Pigeonhole authors, see the included COPYING file - */ - -#include "lib.h" -#include "str.h" -#include "ostream.h" -#include "mail-deliver.h" - -#include "sieve-common.h" -#include "sieve-script.h" -#include "sieve-error-private.h" - -#include "lda-sieve-log.h" - -/* - * Deliver log error handler - */ - -struct lda_sieve_log_ehandler { - struct sieve_error_handler handler; - - struct mail_deliver_context *mdctx; -}; - -typedef void (*log_func_t)(const char *fmt, ...) ATTR_FORMAT(1, 2); - -static void lda_sieve_vlog -(struct sieve_error_handler *_ehandler, log_func_t log_func, - const char *location, const char *fmt, va_list args) -{ - struct lda_sieve_log_ehandler *ehandler = - (struct lda_sieve_log_ehandler *) _ehandler; - struct mail_deliver_context *mdctx = ehandler->mdctx; - string_t *str; - - str = t_str_new(256); - if ( mdctx->session_id != NULL) - str_printfa(str, "%s: ", mdctx->session_id); - - str_append(str, "sieve: "); - - if ( location != NULL && *location != '\0' ) - str_printfa(str, "%s: ", location); - - str_vprintfa(str, fmt, args); - - log_func("%s", str_c(str)); -} - -static void lda_sieve_log_verror -(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED, - const char *location, const char *fmt, va_list args) -{ - lda_sieve_vlog(ehandler, i_error, location, fmt, args); -} -static void lda_sieve_log_vwarning -(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED, - const char *location, const char *fmt, va_list args) -{ - lda_sieve_vlog(ehandler, i_warning, location, fmt, args); -} -static void lda_sieve_log_vinfo -(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED, - const char *location, const char *fmt, va_list args) -{ - lda_sieve_vlog(ehandler, i_info, location, fmt, args); -} - -static void lda_sieve_log_vdebug -(struct sieve_error_handler *ehandler, unsigned int flags ATTR_UNUSED, - const char *location, const char *fmt, va_list args) -{ - lda_sieve_vlog(ehandler, i_debug, location, fmt, args); -} - -struct sieve_error_handler *lda_sieve_log_ehandler_create -(struct sieve_instance *svinst, struct mail_deliver_context *mdctx, - unsigned int max_errors) -{ - pool_t pool; - struct lda_sieve_log_ehandler *ehandler; - - pool = pool_alloconly_create("lda_sieve_log_error_handler", 256); - ehandler = p_new(pool, struct lda_sieve_log_ehandler, 1); - ehandler->mdctx = mdctx; - - sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors); - - 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; - - return &(ehandler->handler); -} diff --git a/src/plugins/lda-sieve/lda-sieve-log.h b/src/plugins/lda-sieve/lda-sieve-log.h deleted file mode 100644 index 4523b82f64e8bb71ec4fbdb6cf288c2a05e72f40..0000000000000000000000000000000000000000 --- a/src/plugins/lda-sieve/lda-sieve-log.h +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright (c) 2002-2010 Pigeonhole authors, see the included COPYING file - */ - -#ifndef __LDA_SIEVE_LOG -#define __LDA_SIEVE_LOG - -#include "lib.h" -#include "mail-deliver.h" - -struct sieve_error_handler *lda_sieve_log_ehandler_create - (struct sieve_instance *svinst, struct mail_deliver_context *mdctx, - unsigned int max_errors); - -#endif /* __LDA_SIEVE_LOG */ diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 0918e3f593607e13071dc69cd93b07359c4d8184..15c8166dc0fb06018803a4adf383ac83178fc8ab 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -15,7 +15,6 @@ #include "sieve.h" #include "lda-sieve-plugin.h" -#include "lda-sieve-log.h" #include <stdlib.h> #include <sys/stat.h> @@ -27,8 +26,7 @@ #define SIEVE_DEFAULT_PATH "~/.dovecot.sieve" -#define LDA_SIEVE_MAX_USER_ERRORS 10 -#define LDA_SIEVE_MAX_SYSTEM_ERRORS 100 +#define LDA_SIEVE_MAX_USER_ERRORS 30 /* * Global variables @@ -569,7 +567,9 @@ static int lda_sieve_run array_append_array(&scripts, scripts_after); - /* Create error handlers */ + /* Initialize error handlers */ + + srctx.master_ehandler = sieve_system_ehandler_get(svinst); if ( user_script != NULL ) { srctx.userlog = t_strconcat(user_script, ".log", NULL); @@ -577,12 +577,6 @@ static int lda_sieve_run (svinst, srctx.userlog, LDA_SIEVE_MAX_USER_ERRORS); } - srctx.master_ehandler = lda_sieve_log_ehandler_create - (svinst, mdctx, LDA_SIEVE_MAX_SYSTEM_ERRORS); - sieve_system_ehandler_set(srctx.master_ehandler); - - sieve_error_handler_accept_infolog(srctx.master_ehandler, TRUE); - /* Collect necessary message data */ memset(&msgdata, 0, sizeof(msgdata)); @@ -650,6 +644,7 @@ static int lda_sieve_deliver_mail (struct mail_deliver_context *mdctx, struct mail_storage **storage_r) { struct sieve_instance *svinst; + struct sieve_error_handler *master_ehandler; const char *user_script, *default_script, *sieve_before, *sieve_after; ARRAY_TYPE (const_string) scripts_before; ARRAY_TYPE (const_string) scripts_after; @@ -660,8 +655,18 @@ static int lda_sieve_deliver_mail svinst = sieve_init(&lda_sieve_env, mdctx->dest_user, debug); + /* Initialize master error handler */ + + master_ehandler = sieve_master_ehandler_create(svinst, mdctx->session_id, 0); + sieve_system_ehandler_set(master_ehandler); + + sieve_error_handler_accept_infolog(master_ehandler, TRUE); + sieve_error_handler_accept_debuglog(master_ehandler, debug); + *storage_r = NULL; + /* Find scripts and run them */ + T_BEGIN { struct stat st;