diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c index 528954fd43475736ff90a914333a9444b4982851..578205c69157d69b413873e7f5aae550a9d50e80 100644 --- a/src/lib-sieve/sieve-error.c +++ b/src/lib-sieve/sieve-error.c @@ -188,6 +188,69 @@ struct sieve_error_handler *sieve_stderr_ehandler_create( void ) return ehandler; } +/* Output errors to a string buffer */ + +struct sieve_strbuf_ehandler { + struct sieve_error_handler handler; + + string_t *errors; +}; + +static void sieve_strbuf_verror +(struct sieve_error_handler *ehandler, const char *location, + const char *fmt, va_list args) +{ + struct sieve_strbuf_ehandler *handler = + (struct sieve_strbuf_ehandler *) ehandler; + + str_printfa(handler->errors, "%s: error: ", location); + str_vprintfa(handler->errors, fmt, args); + str_append(handler->errors, ".\n"); +} + +static void sieve_strbuf_vwarning +(struct sieve_error_handler *ehandler, const char *location, + const char *fmt, va_list args) +{ + struct sieve_strbuf_ehandler *handler = + (struct sieve_strbuf_ehandler *) ehandler; + + str_printfa(handler->errors, "%s: warning: ", location); + str_vprintfa(handler->errors, fmt, args); + str_append(handler->errors, ".\n"); +} + +static void sieve_strbuf_vinfo +(struct sieve_error_handler *ehandler, const char *location, + const char *fmt, va_list args) +{ + struct sieve_strbuf_ehandler *handler = + (struct sieve_strbuf_ehandler *) ehandler; + + str_printfa(handler->errors, "%s: info: ", location); + str_vprintfa(handler->errors, fmt, args); + str_append(handler->errors, ".\n"); +} + +struct sieve_error_handler *sieve_strbuf_ehandler_create +(string_t *strbuf) +{ + pool_t pool; + struct sieve_strbuf_ehandler *ehandler; + + pool = pool_alloconly_create("strbuf_error_handler", 256); + ehandler = p_new(pool, struct sieve_strbuf_ehandler, 1); + ehandler->errors = strbuf; + ehandler->handler.pool = pool; + ehandler->handler.errors = 0; + ehandler->handler.warnings = 0; + ehandler->handler.verror = sieve_strbuf_verror; + ehandler->handler.vwarning = sieve_strbuf_vwarning; + ehandler->handler.vinfo = sieve_strbuf_vinfo; + + return &(ehandler->handler); +} + /* Output errors to a log file */ struct sieve_logfile_ehandler { diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h index 00d395f84b10fbf5872f7ff4cbb8fae3ee6dfdc8..3b389cb8a5c4543c9e0aa16f22bc12a84979ccf1 100644 --- a/src/lib-sieve/sieve-error.h +++ b/src/lib-sieve/sieve-error.h @@ -102,6 +102,7 @@ void sieve_error_handler_free(struct sieve_error_handler **ehandler); /* Error handlers */ struct sieve_error_handler *sieve_stderr_ehandler_create(void); +struct sieve_error_handler *sieve_strbuf_ehandler_create(string_t *strbuf); struct sieve_error_handler *sieve_logfile_ehandler_create(const char *logfile); #endif /* __SIEVE_ERROR_H */