From b59f6ec67a5fb68a1448ea5fba40a792c58f435b Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Wed, 25 Dec 2013 21:40:19 +0100
Subject: [PATCH] lib-sieve: Added method to script object for obtaining the
 directory where the script binary is stored.

---
 src/lib-sieve/sieve-script-dict.c    |  1 +
 src/lib-sieve/sieve-script-file.c    |  9 +++++++++
 src/lib-sieve/sieve-script-private.h |  2 ++
 src/lib-sieve/sieve-script.c         | 14 ++++++++++++++
 src/lib-sieve/sieve-script.h         |  3 +++
 5 files changed, 29 insertions(+)

diff --git a/src/lib-sieve/sieve-script-dict.c b/src/lib-sieve/sieve-script-dict.c
index 14358662d..939328b60 100644
--- a/src/lib-sieve/sieve-script-dict.c
+++ b/src/lib-sieve/sieve-script-dict.c
@@ -289,6 +289,7 @@ const struct sieve_script sieve_dict_script = {
 		sieve_dict_script_binary_write_metadata,
 		sieve_dict_script_binary_load,
 		sieve_dict_script_binary_save,
+		NULL,
 
 		NULL,
 		sieve_dict_script_equals
diff --git a/src/lib-sieve/sieve-script-file.c b/src/lib-sieve/sieve-script-file.c
index eee6f5082..71c132669 100644
--- a/src/lib-sieve/sieve-script-file.c
+++ b/src/lib-sieve/sieve-script-file.c
@@ -354,6 +354,14 @@ static int sieve_file_script_binary_save
 		script->st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO), error_r);
 }
 
+static const char *sieve_file_script_binary_get_directory
+(struct sieve_script *_script)
+{
+	struct sieve_file_script *script = (struct sieve_file_script *)_script;
+	
+	return script->	dirpath;
+}
+
 const struct sieve_script sieve_file_script = {
 	.driver_name = SIEVE_FILE_SCRIPT_DRIVER_NAME,
 	.v = {
@@ -368,6 +376,7 @@ const struct sieve_script sieve_file_script = {
 		NULL,
 		sieve_file_script_binary_load,
 		sieve_file_script_binary_save,
+		sieve_file_script_binary_get_directory,
 
 		sieve_file_script_get_size,
 
diff --git a/src/lib-sieve/sieve-script-private.h b/src/lib-sieve/sieve-script-private.h
index 753d64a6b..edc343716 100644
--- a/src/lib-sieve/sieve-script-private.h
+++ b/src/lib-sieve/sieve-script-private.h
@@ -32,6 +32,8 @@ struct sieve_script_vfuncs {
 	int (*binary_save)
 		(struct sieve_script *script, struct sieve_binary *sbin,
 			bool update, enum sieve_error *error_r);
+	const char *(*binary_get_directory)
+		(struct sieve_script *script);
 
 	int (*get_size)
 		(const struct sieve_script *script, uoff_t *size_r);
diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index 19869483b..720b16c5e 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -542,6 +542,20 @@ int sieve_script_binary_save
 	return script->v.binary_save(script, sbin, update, error_r);
 }
 
+const char *sieve_script_binary_get_directory
+(struct sieve_script *script)
+{
+	if ( script->bin_dir != NULL &&
+		sieve_script_setup_bindir(script, 0700) >= 0 ) {
+		return script->bin_dir;
+	}
+
+	if ( script->v.binary_get_directory == NULL )
+		return NULL;
+
+	return script->v.binary_get_directory(script);
+}
+
 int sieve_script_setup_bindir
 (struct sieve_script *script, mode_t mode)
 {
diff --git a/src/lib-sieve/sieve-script.h b/src/lib-sieve/sieve-script.h
index 74c02b823..eb2dc73f1 100644
--- a/src/lib-sieve/sieve-script.h
+++ b/src/lib-sieve/sieve-script.h
@@ -68,6 +68,9 @@ int sieve_script_binary_save
 	(struct sieve_script *script, struct sieve_binary *sbin, bool update,
 		enum sieve_error *error_r);
 
+const char *sieve_script_binary_get_directory
+	(struct sieve_script *script);
+
 /*
  * Stream management
  */
-- 
GitLab