From bb78d0b1c60c0ce5718708dcbc159899c6d4ab67 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Thu, 6 Dec 2007 17:22:16 +0100
Subject: [PATCH] Changed execution error handling a little.

---
 src/lib-sieve/sieve-interpreter.c        | 10 +++++----
 src/lib-sieve/sieve-interpreter.h        |  2 +-
 src/lib-sieve/sieve-result.c             | 10 ++++++---
 src/lib-sieve/sieve-result.h             |  2 +-
 src/lib-sieve/sieve.c                    | 20 ++++++++---------
 src/lib-sieve/sieve.h                    |  4 ++--
 src/plugins/lda-sieve/lda-sieve-plugin.c | 28 ++++++++++++------------
 src/sieve-bin/sieve-exec.c               |  2 +-
 8 files changed, 42 insertions(+), 36 deletions(-)

diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index d75b7db05..8266d5419 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -274,11 +274,12 @@ bool sieve_interpreter_execute_operation
 	return FALSE;
 }		
 
-bool sieve_interpreter_run
+int sieve_interpreter_run
 (struct sieve_interpreter *interp, const struct sieve_message_data *msgdata,
 	const struct sieve_mail_environment *menv, struct sieve_result **result) 
 {
 	bool is_topmost = ( *result == NULL );
+	int ret = 0;
 	sieve_interpreter_reset(interp);
 	
 	if ( is_topmost )
@@ -297,7 +298,7 @@ bool sieve_interpreter_run
 		if ( !sieve_interpreter_execute_operation(interp) ) {
 			printf("Execution aborted.\n");
 			sieve_result_unref(result);
-			return FALSE;
+			return -1;
 		}
 	}
 	
@@ -305,13 +306,14 @@ bool sieve_interpreter_run
 	interp->runenv.msgdata = NULL;
 	interp->runenv.mailenv = NULL;
 	
+	ret = 1;
 	if ( is_topmost ) {
-		sieve_result_execute(*result, msgdata, menv);
+		ret = sieve_result_execute(*result, msgdata, menv);
 	}
 	
 	sieve_result_unref(result);
 	
-	return TRUE;
+	return ret;
 }
 
 
diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h
index 5fb77fe38..abd5018df 100644
--- a/src/lib-sieve/sieve-interpreter.h
+++ b/src/lib-sieve/sieve-interpreter.h
@@ -69,7 +69,7 @@ bool sieve_interpreter_handle_optional_operands
 
 bool sieve_interpreter_execute_operation(struct sieve_interpreter *interp); 
 
-bool sieve_interpreter_run
+int sieve_interpreter_run
 (struct sieve_interpreter *interp, const struct sieve_message_data *msgdata,
 	const struct sieve_mail_environment *menv, struct sieve_result **result);
 
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index 2d7dad57a..853540217 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -238,7 +238,7 @@ static bool sieve_result_implicit_keep(struct sieve_result *result)
 	return FALSE;
 }
 
-bool sieve_result_execute
+int sieve_result_execute
 	(struct sieve_result *result, const struct sieve_message_data *msgdata,
 		const struct sieve_mail_environment *menv)
 { 
@@ -375,11 +375,15 @@ bool sieve_result_execute
 	 */
 	if ( !commit_ok || implicit_keep ) {
 		printf("Executing implicit keep\n");
-		return sieve_result_implicit_keep(result);
+		
+		if ( !sieve_result_implicit_keep(result) ) 
+			return -1;
+			
+		return ( commit_ok ? 1 /* Success */ : 0 /* Implicit keep executed */ );
 	}
 	
 	/* Unconditional success */
-	return TRUE;
+	return 1;
 }
 
 /*
diff --git a/src/lib-sieve/sieve-result.h b/src/lib-sieve/sieve-result.h
index f0889ccbe..f24ff09f3 100644
--- a/src/lib-sieve/sieve-result.h
+++ b/src/lib-sieve/sieve-result.h
@@ -31,7 +31,7 @@ bool sieve_result_print(struct sieve_result *result);
 
 void sieve_result_cancel_implicit_keep(struct sieve_result *result);
 
-bool sieve_result_execute
+int sieve_result_execute
 	(struct sieve_result *result, const struct sieve_message_data *msgdata,
 		const struct sieve_mail_environment *menv);
 		
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 5bffec481..9a9489bda 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -151,7 +151,7 @@ void sieve_dump(struct sieve_binary *sbin, struct ostream *stream)
 	sieve_code_dumper_free(dumpr);
 }
 
-bool sieve_test
+int sieve_test
 	(struct sieve_binary *sbin, const struct sieve_message_data *msgdata,
 		const struct sieve_mail_environment *menv, 
 		struct sieve_error_handler *ehandler) 	
@@ -159,19 +159,19 @@ bool sieve_test
 	struct sieve_result *sres = sieve_result_create(ehandler);
 	struct sieve_interpreter *interp = 
 		sieve_interpreter_create(sbin, ehandler);			
-	bool result = TRUE;
+	int ret = 0;
 							
-	result = sieve_interpreter_run(interp, msgdata, menv, &sres);
+	ret = sieve_interpreter_run(interp, msgdata, menv, &sres);
 	
-	if ( result ) 
-		sieve_result_print(sres);
+	if ( ret > 0 ) 
+		ret = sieve_result_print(sres);
 	
 	sieve_interpreter_free(interp);
 	sieve_result_unref(&sres);
-	return result;
+	return ret;
 }
 
-bool sieve_execute
+int sieve_execute
 	(struct sieve_binary *sbin, const struct sieve_message_data *msgdata,
 		const struct sieve_mail_environment *menv,
 		struct sieve_error_handler *ehandler) 	
@@ -179,13 +179,13 @@ bool sieve_execute
 	struct sieve_result *sres = NULL;
 	struct sieve_interpreter *interp = 
 		sieve_interpreter_create(sbin, ehandler);			
-	bool result = TRUE;
+	int ret = 0;
 							
-	result = sieve_interpreter_run(interp, msgdata, menv, &sres);
+	ret = sieve_interpreter_run(interp, msgdata, menv, &sres);
 				
 	sieve_interpreter_free(interp);
 	sieve_result_unref(&sres);
-	return result;
+	return ret;
 }
 
 
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index e4f755b13..d19c3edc7 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -51,12 +51,12 @@ struct sieve_binary *sieve_compile
 	(const char *scriptpath, struct sieve_error_handler *ehandler);
 
 void sieve_dump(struct sieve_binary *sbin, struct ostream *stream);
-bool sieve_test
+int sieve_test
 	(struct sieve_binary *sbin, const struct sieve_message_data *msgdata, 
 		const struct sieve_mail_environment *menv, 
 		struct sieve_error_handler *ehandler);
 
-bool sieve_execute
+int sieve_execute
 	(struct sieve_binary *sbin, const struct sieve_message_data *msgdata,
 		const struct sieve_mail_environment *menv,
 		struct sieve_error_handler *ehandler);
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 328bd8f1b..5167b8a27 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -84,8 +84,7 @@ static int lda_sieve_run
 	struct sieve_error_handler *ehandler;
 	struct sieve_binary *sbin;
 	const char *scriptlog;
-
-	t_push();
+	int ret = 0;
 
 	scriptlog = t_strconcat(script_path, ".log", NULL);
 	ehandler = sieve_logfile_ehandler_create(scriptlog);
@@ -98,7 +97,6 @@ static int lda_sieve_run
 			"Log should be available as %s", scriptlog);
 
 		sieve_error_handler_free(&ehandler);
-		t_pop();
 		return -1;
 	}
 
@@ -129,17 +127,14 @@ static int lda_sieve_run
 	if ( debug )
 		i_info("sieve: Executing (in-memory) script %s", script_path);
 
-	if ( sieve_execute(sbin, &msgdata, &mailenv, ehandler) ) {		
-		sieve_error_handler_free(&ehandler);
-		t_pop();
-		return 1;
-	}
+	ret = sieve_execute(sbin, &msgdata, &mailenv, ehandler);
+
+	if ( ret < 0 )
+		i_error("sieve: Failed to execute script %s", script_path);
 
-	i_error("sieve: Failed to execute script");
-	
 	sieve_error_handler_free(&ehandler);
-	t_pop();
-	return -1;
+
+	return ret;
 }
 
 static int lda_sieve_deliver_mail
@@ -147,6 +142,7 @@ static int lda_sieve_deliver_mail
 	struct mail *mail, const char *destaddr, const char *mailbox)
 {
 	const char *script_path;
+	int ret;
 
 	script_path = lda_sieve_get_path();
 	if (script_path == NULL)
@@ -155,8 +151,12 @@ static int lda_sieve_deliver_mail
 	if (getenv("DEBUG") != NULL)
 		i_info("sieve: Using sieve path: %s", script_path);
 
-	return lda_sieve_run(namespaces, mail, script_path,
-			     destaddr, getenv("USER"), mailbox);
+	T_FRAME(
+		ret = lda_sieve_run(namespaces, mail, script_path, destaddr, 
+			getenv("USER"), mailbox)
+	);
+
+	return ( ret >= 0 ? 1 : -1 ); 
 }
 
 void sieve_plugin_init(void)
diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c
index 82a7fcee2..cce9edce7 100644
--- a/src/sieve-bin/sieve-exec.c
+++ b/src/sieve-bin/sieve-exec.c
@@ -189,7 +189,7 @@ int main(int argc, char **argv)
 	sieve_error_handler_accept_infolog(ehandler, TRUE);
 
 	/* Run */
-	if ( sieve_execute(sbin, &msgdata, &mailenv, ehandler) )
+	if ( sieve_execute(sbin, &msgdata, &mailenv, ehandler) > 0 )
 		i_info("Final result: success\n");
 	else
 		i_info("Final result: failed (caller please handle implicit keep!)\n");
-- 
GitLab