From e7905807730b7092d4557b0d5338b674ceeb24c1 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sun, 28 Jun 2009 15:57:09 +0200
Subject: [PATCH] Added support for CRLF line breaks in strbuf error handler
 (ManageSieve fix).

---
 src/lib-sieve/sieve-error.c | 23 +++++++++++++++++++----
 src/lib-sieve/sieve-error.h |  2 +-
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index c2f1e628f..51bf7e5b7 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -382,6 +382,7 @@ struct sieve_strbuf_ehandler {
 	struct sieve_error_handler handler;
 
 	string_t *errors;
+	bool crlf;
 };
 
 static void sieve_strbuf_verror
@@ -395,7 +396,11 @@ static void sieve_strbuf_verror
 		str_printfa(handler->errors, "%s: ", location);
 	str_append(handler->errors, "error: ");
 	str_vprintfa(handler->errors, fmt, args);
-	str_append(handler->errors, ".\n");
+
+	if ( !handler->crlf )
+		str_append(handler->errors, ".\n");
+	else
+		str_append(handler->errors, ".\r\n");
 }
 
 static void sieve_strbuf_vwarning
@@ -409,7 +414,11 @@ static void sieve_strbuf_vwarning
 		str_printfa(handler->errors, "%s: ", location);
 	str_printfa(handler->errors, "warning: ");
 	str_vprintfa(handler->errors, fmt, args);
-	str_append(handler->errors, ".\n");
+
+	if ( !handler->crlf )
+		str_append(handler->errors, ".\n");
+	else
+		str_append(handler->errors, ".\r\n");
 }
 
 static void sieve_strbuf_vinfo
@@ -423,11 +432,15 @@ static void sieve_strbuf_vinfo
 		str_printfa(handler->errors, "%s: ", location);	
 	str_printfa(handler->errors, "info: ");
 	str_vprintfa(handler->errors, fmt, args);
-	str_append(handler->errors, ".\n");
+
+	if ( !handler->crlf )
+		str_append(handler->errors, ".\n");
+	else
+		str_append(handler->errors, ".\r\n");
 }
 
 struct sieve_error_handler *sieve_strbuf_ehandler_create
-(string_t *strbuf, unsigned int max_errors)
+(string_t *strbuf, bool crlf, unsigned int max_errors)
 {
 	pool_t pool;
 	struct sieve_strbuf_ehandler *ehandler;
@@ -442,6 +455,8 @@ struct sieve_error_handler *sieve_strbuf_ehandler_create
 	ehandler->handler.vwarning = sieve_strbuf_vwarning;
 	ehandler->handler.vinfo = sieve_strbuf_vinfo;
 
+	ehandler->crlf = crlf;
+
 	return &(ehandler->handler);
 }
 
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index 4ee103e01..9dda47517 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -163,7 +163,7 @@ struct sieve_error_handler *sieve_stderr_ehandler_create
 
 /* Write errors into a string buffer */
 struct sieve_error_handler *sieve_strbuf_ehandler_create
-	(string_t *strbuf, unsigned int max_errors);
+	(string_t *strbuf, bool crlf, unsigned int max_errors);
 
 /* Write errors to a logfile */
 struct sieve_error_handler *sieve_logfile_ehandler_create
-- 
GitLab