diff -urN -x .svn OpenDNSSEC-1.3.orig/enforcer/enforcerd/enforcer.c OpenDNSSEC-1.3/enforcer/enforcerd/enforcer.c --- OpenDNSSEC-1.3.orig/enforcer/enforcerd/enforcer.c 2012-05-14 14:46:16.000000000 +0200 +++ OpenDNSSEC-1.3/enforcer/enforcerd/enforcer.c 2012-05-14 14:47:16.000000000 +0200 @@ -246,7 +246,9 @@ } /* Communicate zones to the signer */ + KsmParameterCollectionCache(1); /* Enable caching of policy parameters while in do_communication() */ do_communication(config, policy); + KsmParameterCollectionCache(0); DbFreeResult(handle); diff -urN -x .svn OpenDNSSEC-1.3.orig/enforcer/ksm/include/ksm/ksm.h OpenDNSSEC-1.3/enforcer/ksm/include/ksm/ksm.h --- OpenDNSSEC-1.3.orig/enforcer/ksm/include/ksm/ksm.h 2012-05-14 14:46:16.000000000 +0200 +++ OpenDNSSEC-1.3/enforcer/ksm/include/ksm/ksm.h 2012-05-14 14:49:15.000000000 +0200 @@ -510,6 +510,7 @@ int KsmParameterRetSafety(KSM_PARCOLL* collection); int KsmParameterInitialPublicationInterval(KSM_PARCOLL* collection); int KsmParameterCollection(KSM_PARCOLL* data, int policy_id); +void KsmParameterCollectionCache(int enable); /* ksm_keyword */ diff -urN -x .svn OpenDNSSEC-1.3.orig/enforcer/ksm/ksm_parameter.c OpenDNSSEC-1.3/enforcer/ksm/ksm_parameter.c --- OpenDNSSEC-1.3.orig/enforcer/ksm/ksm_parameter.c 2012-05-14 14:46:16.000000000 +0200 +++ OpenDNSSEC-1.3/enforcer/ksm/ksm_parameter.c 2012-05-14 14:47:16.000000000 +0200 @@ -382,6 +382,21 @@ * output. -*/ +static KSM_PARCOLL __parcoll_cache; +static int __parcoll_cache_policy_id; +static int __parcoll_cached = 0; +static int __parcoll_cache_enabled = 0; + +void KsmParameterCollectionCache(int enable) { + if (enable && !__parcoll_cache_enabled) { + __parcoll_cache_enabled = 1; + __parcoll_cached = 0; + } + else if (!enable && __parcoll_cache_enabled) { + __parcoll_cache_enabled = 0; + } +} + int KsmParameterCollection(KSM_PARCOLL* data, int policy_id) { int status = 0; @@ -392,6 +407,11 @@ return MsgLog(KSM_INVARG, "NULL data"); } + if (__parcoll_cache_enabled && __parcoll_cached && __parcoll_cache_policy_id == policy_id) { + memcpy(data, &__parcoll_cache, sizeof(KSM_PARCOLL)); + return 0; + } + status = KsmParameterValue(KSM_PAR_CLOCKSKEW_STRING, KSM_PAR_CLOCKSKEW_CAT, &(data->clockskew), policy_id, ¶m_id); if (status > 0) return status; @@ -458,6 +478,12 @@ data->kskroll = KSM_ROLL_DEFAULT; /*}*/ + if (__parcoll_cache_enabled) { + memcpy(&__parcoll_cache, data, sizeof(KSM_PARCOLL)); + __parcoll_cache_policy_id = policy_id; + __parcoll_cached = 1; + } + return 0; }