From ce342b015ccdf8dfc21b5c20ad730ddb96358d98 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sat, 26 Jul 2014 01:17:51 +0200
Subject: [PATCH] lib-sieve: ldap storage: Implemented checking config mtime
 for binary recompile.

---
 src/lib-sieve/storage/ldap/sieve-ldap-script.c     | 10 ++++++++++
 .../storage/ldap/sieve-ldap-storage-settings.c     | 14 ++++++++++++++
 src/lib-sieve/storage/ldap/sieve-ldap-storage.h    |  2 ++
 3 files changed, 26 insertions(+)

diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
index 7c7dc67c7..affe58985 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
@@ -125,17 +125,26 @@ static int sieve_ldap_script_binary_read_metadata
 {
 	struct sieve_ldap_script *lscript =
 		(struct sieve_ldap_script *)script;
+	struct sieve_ldap_storage *lstorage =
+		(struct sieve_ldap_storage *)script->storage;		
 	struct sieve_binary *sbin =
 		sieve_binary_block_get_binary(sblock);
 	string_t *dn, *modattr;
 
+	/* config file changed? */
+	if ( sieve_binary_mtime(sbin) <= lstorage->set_mtime )
+		return 0;
+
+	/* open script if not open already */
 	if ( lscript->dn == NULL &&
 		sieve_script_open(script, NULL) < 0 )
 		return 0;
 
+	/* if modattr not found recompile always */
 	if ( lscript->modattr == NULL || *lscript->modattr == '\0' )
 		return 0;
 
+	/* compare DN in binary and from search result */
 	if ( !sieve_binary_read_string(sblock, offset, &dn) ) {
 		sieve_script_sys_error(script,
 			"Binary `%s' has invalid metadata for script `%s': "
@@ -147,6 +156,7 @@ static int sieve_ldap_script_binary_read_metadata
 	if ( strcmp(str_c(dn), lscript->dn) != 0 )
 		return 0;
 
+	/* compare modattr in binary and from search result */
 	if ( !sieve_binary_read_string(sblock, offset, &modattr) ) {
 		sieve_script_sys_error(script,
 			"Binary `%s' has invalid metadata for script `%s': "
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
index 548d2530f..040eb1b68 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
@@ -15,6 +15,10 @@
 
 #include "sieve-ldap-db.h"
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
 #define DEF_STR(name) DEF_STRUCT_STR(name, sieve_ldap_storage_settings)
 #define DEF_INT(name) DEF_STRUCT_INT(name, sieve_ldap_storage_settings)
 #define DEF_BOOL(name) DEF_STRUCT_BOOL(name, sieve_ldap_storage_settings)
@@ -87,8 +91,18 @@ int sieve_ldap_storage_read_settings
 {
 	struct sieve_storage *storage = &lstorage->storage;
 	const char *str, *error;
+	struct stat st;
+
+	if ( stat(config_path, &st) < 0 ) {
+		sieve_storage_sys_error(storage,
+			"Failed to read LDAP storage config: "
+			"stat(%s) failed: %m", config_path);
+		return -1;
+	}
 
 	lstorage->set = default_settings;
+	lstorage->set_mtime = st.st_mtime;
+	
 	if (!settings_read_nosection
 		(config_path, parse_setting, lstorage, &error)) {
 		sieve_storage_set_critical(storage,
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
index fbd9aa906..5ddbc5a44 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
@@ -64,7 +64,9 @@ int sieve_ldap_storage_read_settings
 
 struct sieve_ldap_storage {
 	struct sieve_storage storage;
+
 	struct sieve_ldap_storage_settings set;
+	time_t set_mtime;
 
 	const char *username; // FIXME: needed?
 
-- 
GitLab