From 0bbc07907fc7d81c6252fbefaf9f49c1cc70c5eb Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Thu, 5 Nov 2009 15:29:20 +0100
Subject: [PATCH] Properly implemented settings retrieval API.

---
 src/lib-sieve-tool/sieve-tool.c               | 21 ++++++--
 src/lib-sieve-tool/sieve-tool.h               |  2 +-
 src/lib-sieve/Makefile.am                     |  2 -
 src/lib-sieve/plugins/include/cmd-include.c   |  2 +-
 .../plugins/include/ext-include-binary.c      |  3 +-
 .../plugins/include/ext-include-common.c      | 20 +++++---
 .../plugins/include/ext-include-common.h      | 26 ++++++----
 src/lib-sieve/plugins/include/ext-include.c   |  5 +-
 .../plugins/subaddress/ext-subaddress.c       |  7 ++-
 src/lib-sieve/sieve-common.h                  | 25 ++++++++--
 src/lib-sieve/sieve-settings.c                | 50 -------------------
 src/lib-sieve/sieve-settings.h                | 17 -------
 src/lib-sieve/sieve.c                         |  1 -
 src/lib-sieve/sieve.h                         |  1 -
 src/plugins/lda-sieve/lda-sieve-plugin.c      |  3 --
 src/sieve-tools/sievec.c                      |  2 +-
 src/testsuite/Makefile.am                     |  4 +-
 src/testsuite/testsuite.c                     |  6 ++-
 18 files changed, 84 insertions(+), 113 deletions(-)
 delete mode 100644 src/lib-sieve/sieve-settings.c
 delete mode 100644 src/lib-sieve/sieve-settings.h

diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c
index 390f5107c..61d95f0e2 100644
--- a/src/lib-sieve-tool/sieve-tool.c
+++ b/src/lib-sieve-tool/sieve-tool.c
@@ -27,8 +27,18 @@ static struct ioloop *ioloop;
 
 struct sieve_instance *sieve_instance;
 
-static const struct sieve_callbacks sieve_callbacks = {
-	NULL
+/*
+ * Settings management
+ */
+
+static const char *sieve_tool_get_setting
+(void *context ATTR_UNUSED, const char *identifier)
+{
+	return getenv(t_str_ucase(identifier));
+}
+
+static const struct sieve_callbacks sieve_tool_callbacks = {
+	sieve_tool_get_setting
 };
 
 /*
@@ -57,7 +67,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
 /* HACK */
 static bool _init_lib = FALSE;
 
-void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib) 
+void sieve_tool_init(const struct sieve_callbacks *callbacks, bool init_lib) 
 {
 	_init_lib = init_lib;
 
@@ -73,13 +83,14 @@ void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib)
 		lib_signals_ignore(SIGALRM, FALSE);
 	}
 
-	if ( (sieve_instance=sieve_init(&sieve_callbacks, NULL)) == NULL )
+	if ( callbacks == NULL ) callbacks = &sieve_tool_callbacks;
+
+	if ( (sieve_instance=sieve_init(callbacks, NULL)) == NULL )
 		i_fatal("failed to initialize sieve implementation\n");
 }
 
 void sieve_tool_deinit(void)
 {
-	sieve_deinit();
 	sieve_deinit(&sieve_instance);
 
 	if ( _init_lib ) {
diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h
index 80f12ef60..dacda5e51 100644
--- a/src/lib-sieve-tool/sieve-tool.h
+++ b/src/lib-sieve-tool/sieve-tool.h
@@ -18,7 +18,7 @@ struct sieve_instance *sieve_instance;
  * Initialization
  */
 
-void sieve_tool_init(sieve_settings_func_t settings_func, bool init_lib);
+void sieve_tool_init(const struct sieve_callbacks *callbacks, bool init_lib);
 void sieve_tool_deinit(void);
 
 /*
diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am
index fed7eb2f6..fcf02ea48 100644
--- a/src/lib-sieve/Makefile.am
+++ b/src/lib-sieve/Makefile.am
@@ -72,7 +72,6 @@ libsieve_la_LIBADD = $(plugins)
 libsieve_la_SOURCES = \
 	rfc2822.c \
 	sieve-limits.c \
-	sieve-settings.c \
 	sieve-message.c \
 	sieve-smtp.c \
 	sieve-lexer.c \
@@ -110,7 +109,6 @@ noinst_HEADERS = \
 	sieve-types.h \
 	sieve-common.h \
 	sieve-limits.h \
-	sieve-settings.h \
 	sieve-message.h \
 	sieve-smtp.h \
 	sieve-lexer.h \
diff --git a/src/lib-sieve/plugins/include/cmd-include.c b/src/lib-sieve/plugins/include/cmd-include.c
index 8e6816529..473c9e6c0 100644
--- a/src/lib-sieve/plugins/include/cmd-include.c
+++ b/src/lib-sieve/plugins/include/cmd-include.c
@@ -234,7 +234,7 @@ static bool cmd_include_validate
 	}
 		
 	script_path = ext_include_get_script_directory
-		(ctx_data->location, script_name);
+		(this_ext, ctx_data->location, script_name);
 	if ( script_path == NULL ) {
 		sieve_argument_validate_error(valdtr, arg,
 			"include: %s location for included script '%s' is unavailable "
diff --git a/src/lib-sieve/plugins/include/ext-include-binary.c b/src/lib-sieve/plugins/include/ext-include-binary.c
index 3c02dc48d..9d6711bf2 100644
--- a/src/lib-sieve/plugins/include/ext-include-binary.c
+++ b/src/lib-sieve/plugins/include/ext-include-binary.c
@@ -288,7 +288,8 @@ static bool ext_include_binary_open
 		}		
 		
 		/* Can we find/open the script dependency ? */
-		script_dir = ext_include_get_script_directory(location, str_c(script_name));		
+		script_dir = ext_include_get_script_directory
+			(ext, location, str_c(script_name));		
 		if ( script_dir == NULL || 
 			!(script=sieve_script_create_in_directory
 				(ext->svinst, script_dir, str_c(script_name), NULL, NULL)) ) {
diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index 4445c9b37..de16f8b81 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -7,7 +7,6 @@
 #include "home-expand.h"
 
 #include "sieve-common.h"
-#include "sieve-settings.h"
 #include "sieve-error.h"
 #include "sieve-script.h"
 #include "sieve-ast.h"
@@ -69,16 +68,21 @@ struct ext_include_interpreter_context {
  */
 
 const char *ext_include_get_script_directory
-(enum ext_include_script_location location, const char *script_name)
+(const struct sieve_extension *ext, enum ext_include_script_location location,
+   const char *script_name)
 {
-	const char *home, *sieve_dir;
+	struct sieve_instance *svinst = ext->svinst;
+	const char *home = NULL, *sieve_dir = NULL;
 
 	switch ( location ) {
 	case EXT_INCLUDE_LOCATION_PERSONAL:
-		sieve_dir = sieve_setting_get("dir");
-		home = getenv("HOME");
+ 		sieve_dir = sieve_get_setting(svinst, "sieve_dir");
+
+		if ( sieve_dir == NULL ) {
+			home = sieve_get_setting(svinst, "home");
+
+			if ( home == NULL ) home = getenv("HOME");
 
-		if (sieve_dir == NULL) {
 			if ( home == NULL )	{		
 				sieve_sys_error(
 					"include: sieve_dir and home not set for :personal script include "	
@@ -94,7 +98,7 @@ const char *ext_include_get_script_directory
 
 		break;
    	case EXT_INCLUDE_LOCATION_GLOBAL:
-		sieve_dir = sieve_setting_get("global_dir");
+		sieve_dir = sieve_get_setting(svinst, "global_dir");
 
 		if (sieve_dir == NULL) {
 			sieve_sys_error(
@@ -105,7 +109,7 @@ const char *ext_include_get_script_directory
 
 		break;
 	default:
-		return NULL;
+		break;
 	}
 
 	return sieve_dir;
diff --git a/src/lib-sieve/plugins/include/ext-include-common.h b/src/lib-sieve/plugins/include/ext-include-common.h
index ac367694c..6eb10cdc9 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.h
+++ b/src/lib-sieve/plugins/include/ext-include-common.h
@@ -52,16 +52,6 @@ static inline const char *ext_include_script_location_name
 extern const struct sieve_extension_def include_extension;
 extern const struct sieve_binary_extension include_binary_ext;
 
-struct ext_include_context {
-	const struct sieve_extension *var_ext;
-};
-
-static inline struct ext_include_context *ext_include_get_context
-(const struct sieve_extension *ext)
-{
-	return (struct ext_include_context *) ext->context;
-}
-
 /* 
  * Commands 
  */
@@ -93,12 +83,26 @@ extern const struct sieve_operation_def global_operation;
  */
 
 const char *ext_include_get_script_directory
-	(enum ext_include_script_location location, const char *script_name);
+	(const struct sieve_extension *ext,
+		enum ext_include_script_location location, const char *script_name);
 
 /* 
  * Context 
  */
  
+/* Extension context */
+
+struct ext_include_context {
+	/* Extension dependencies */
+	const struct sieve_extension *var_ext;
+};
+
+static inline struct ext_include_context *ext_include_get_context
+(const struct sieve_extension *ext)
+{
+	return (struct ext_include_context *) ext->context;
+}
+
 /* AST Context */
 
 struct ext_include_ast_context {
diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c
index edaa23c3b..90b40ad80 100644
--- a/src/lib-sieve/plugins/include/ext-include.c
+++ b/src/lib-sieve/plugins/include/ext-include.c
@@ -84,8 +84,10 @@ static bool ext_include_load
 (const struct sieve_extension *ext, void **context)
 {
 	struct ext_include_context *ctx = i_new(struct ext_include_context, 1);
-	
+
+	/* Extension dependencies */	
 	ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst);
+
 	*context = ctx;
 
 	return TRUE;
@@ -95,6 +97,7 @@ static void ext_include_unload
 (const struct sieve_extension *ext)
 {
 	struct ext_include_context *ctx = (struct ext_include_context *) ext->context;
+
 	i_free(ctx);
 }
 
diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
index fe7e8a09b..367b11f3e 100644
--- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c
+++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
@@ -13,7 +13,6 @@
  
 #include "sieve-common.h"
 
-#include "sieve-settings.h"
 #include "sieve-code.h"
 #include "sieve-address.h"
 #include "sieve-extensions.h"
@@ -51,7 +50,7 @@ static struct sieve_operand_def subaddress_operand;
 
 static bool ext_subaddress_load
 	(const struct sieve_extension *ext, void **context);
-static bool ext_subaddress_unload
+static void ext_subaddress_unload
 	(const struct sieve_extension *ext);
 static bool ext_subaddress_validator_load
 	(const struct sieve_extension *ext, struct sieve_validator *validator);
@@ -70,7 +69,7 @@ static bool ext_subaddress_load
 (const struct sieve_extension *ext, void **context)
 {
 	struct ext_subaddress_config *config;
-	const char *sep = getenv("SIEVE_SUBADDRESS_SEP");
+	const char *sep = sieve_get_setting(ext->svinst, "sieve_subaddress_sep");
 
 	if ( sep == NULL )
 		sep = SUBADDRESS_DEFAULT_SEP;
@@ -83,7 +82,7 @@ static bool ext_subaddress_load
 	return TRUE;
 }
 
-static bool ext_subaddress_unload
+static void ext_subaddress_unload
 (const struct sieve_extension *ext)
 {
 	struct ext_subaddress_config *config =
diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h
index fbd44044a..e92f83d4b 100644
--- a/src/lib-sieve/sieve-common.h
+++ b/src/lib-sieve/sieve-common.h
@@ -15,9 +15,9 @@
  * Types
  */
 
-typedef size_t        sieve_size_t; 
-typedef uint32_t      sieve_offset_t;
-typedef uint32_t      sieve_number_t;
+typedef size_t sieve_size_t; 
+typedef uint32_t sieve_offset_t;
+typedef uint32_t sieve_number_t;
 
 #define SIEVE_MAX_NUMBER ((sieve_number_t) -1)
 
@@ -135,13 +135,30 @@ bool sieve_validate
  */
 
 struct sieve_instance {
+	/* Main engine pool */
 	pool_t pool;
 
+	/* Callbacks */
 	const struct sieve_callbacks *callbacks;
-
 	void *context;
 
+	/* Extension registry */
 	struct sieve_extension_registry *ext_reg;
 };
 
+/*
+ * Settings
+ */
+
+static inline const char *sieve_get_setting
+(struct sieve_instance *svinst, const char *identifier)
+{
+	const struct sieve_callbacks *callbacks = svinst->callbacks;
+
+	if ( callbacks == NULL || callbacks->get_setting == NULL )
+		return NULL;
+
+	return callbacks->get_setting(svinst->context, identifier);
+}
+
 #endif /* __SIEVE_COMMON_H */
diff --git a/src/lib-sieve/sieve-settings.c b/src/lib-sieve/sieve-settings.c
deleted file mode 100644
index afe0ccaef..000000000
--- a/src/lib-sieve/sieve-settings.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file 
- */
-
-#include "lib.h"
-
-#include "sieve-common.h"
-#include "sieve-extensions.h"
-
-#include "sieve-settings.h"
-
-static sieve_settings_func_t sieve_settings_func = NULL;
-
-/*
- * Initialization
- */
-
-void sieve_settings_init(sieve_settings_func_t settings_func)
-{
-	sieve_settings_func = settings_func;
-}
-
-/*
- * Retrieval
- */
- 
-static const char *_sieve_setting_get_env_name
-(const struct sieve_extension *ext, const char *identifier)
-{
-	if ( ext == NULL )
-		return t_str_lcase(t_strconcat("sieve_", identifier, NULL));
-	
-	return t_str_lcase(t_strconcat("sieve_", ext->name, "_", identifier, NULL));
-}
-
-const char *sieve_setting_get(const char *identifier)
-{
-	if ( sieve_settings_func == NULL )
-		return NULL;
-
-	return sieve_settings_func(_sieve_setting_get_env_name(NULL, identifier));
-}
-
-const char *sieve_setting_get_ext
-(const struct sieve_extension *ext, const char *identifier)
-{
-	if ( sieve_settings_func == NULL )
-		return NULL;
-
-	return sieve_settings_func(_sieve_setting_get_env_name(ext, identifier));
-}
diff --git a/src/lib-sieve/sieve-settings.h b/src/lib-sieve/sieve-settings.h
deleted file mode 100644
index 6ea82863b..000000000
--- a/src/lib-sieve/sieve-settings.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file 
- */
-
-#ifndef __SIEVE_SETTINGS_H
-#define __SIEVE_SETTINGS_H
-
-#include "sieve-common.h"
-
-typedef const char *(*sieve_settings_func_t)(const char *identifier);
-
-void sieve_settings_init(sieve_settings_func_t settings_func);
- 
-const char *sieve_setting_get(const char *identifier);
-const char *sieve_setting_get_ext
-	(const struct sieve_extension *ext, const char *identifier);
-
-#endif /* __SIEVE_SETTINGS_H */
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index a4da11a2f..2da9f3107 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -6,7 +6,6 @@
 #include "istream.h"
 #include "buffer.h"
 
-#include "sieve-settings.h"
 #include "sieve-extensions.h"
 
 #include "sieve-script.h"
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 6272fc16f..b13e066b9 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -12,7 +12,6 @@ struct sieve_binary;
 #include "sieve-config.h"
 #include "sieve-types.h"
 #include "sieve-error.h"
-#include "sieve-settings.h"
 
 /*
  * Main Sieve library interface
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 1b4126c4a..357b9b782 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -12,7 +12,6 @@
 #include "lda-settings.h"
 
 #include "sieve.h"
-#include "sieve-settings.h"
 
 #include "lda-sieve-plugin.h"
 
@@ -54,7 +53,6 @@ static const struct sieve_callbacks lda_sieve_callbacks = {
     lda_sieve_get_setting
 };
 
-
 /*
  * Mail transmission
  */
@@ -603,7 +601,6 @@ static int lda_sieve_deliver_mail
 	ARRAY_TYPE (const_string) scripts_before;
 	ARRAY_TYPE (const_string) scripts_after;
 	bool debug = mdctx->dest_user->mail_debug;
-	const char *extensions = NULL;
 	int ret = 0;
 
 	*storage_r = NULL;
diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c
index 2de0e9570..f6bd4b3e0 100644
--- a/src/sieve-tools/sievec.c
+++ b/src/sieve-tools/sievec.c
@@ -72,7 +72,7 @@ int main(int argc, char **argv) {
 	}
 	
 	if ( outfile == NULL && dump )
-		outfile = "-";
+		outfile = "-";	
 
 	if ( extensions != NULL ) {
 		sieve_set_extensions(sieve_instance, extensions);
diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am
index fb8c9f550..740d0a72b 100644
--- a/src/testsuite/Makefile.am
+++ b/src/testsuite/Makefile.am
@@ -56,6 +56,7 @@ testsuite_SOURCES = \
 	testsuite-smtp.c \
 	testsuite-mailstore.c \
 	testsuite-binary.c \
+	testsuite-settings.c \
 	$(commands) \
 	$(tests) \
 	ext-testsuite.c \
@@ -73,5 +74,6 @@ noinst_HEADERS = \
 	testsuite-result.h \
 	testsuite-smtp.h \
 	testsuite-mailstore.h \
-	testsuite-binary.h
+	testsuite-binary.h \
+	testsuite-settings.h
 
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index 82ee2af0e..eb9583d56 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -51,11 +51,15 @@ const struct sieve_script_env *testsuite_scriptenv;
  * Testsuite initialization 
  */
 
+static const struct sieve_callbacks testsuite_sieve_callbacks = {
+	testsuite_setting_get
+};
+
 static void testsuite_tool_init(const char *extensions) 
 {
 	testsuite_settings_init();
 
-	sieve_tool_init(testsuite_setting_get, FALSE);
+	sieve_tool_init(&testsuite_sieve_callbacks);
 
 	sieve_extensions_set_string(sieve_instance, extensions);
 
-- 
GitLab