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