diff options
Diffstat (limited to 'cachedb/cachedb.c')
-rw-r--r-- | cachedb/cachedb.c | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c index a326d6ef8dbca..9a63101edee38 100644 --- a/cachedb/cachedb.c +++ b/cachedb/cachedb.c @@ -171,12 +171,13 @@ static int cachedb_apply_cfg(struct cachedb_env* cachedb_env, struct config_file* cfg) { const char* backend_str = "testframe"; /* TODO get from cfg */ + (void)cfg; /* need this until the TODO is implemented */ if(backend_str && backend_str[0]) { cachedb_env->backend = cachedb_find_backend(backend_str); if(!cachedb_env->backend) { log_err("cachedb: cannot find backend name '%s", backend_str); - return NULL; + return 0; } } /* TODO see if more configuration needs to be applied or not */ @@ -374,6 +375,36 @@ good_expiry_and_qinfo(struct module_qstate* qstate, struct sldns_buffer* buf) return 1; } +static void +packed_rrset_ttl_subtract(struct packed_rrset_data* data, time_t subtract) +{ + size_t i; + size_t total = data->count + data->rrsig_count; + if(data->ttl > subtract) + data->ttl -= subtract; + else data->ttl = 0; + for(i=0; i<total; i++) { + if(data->rr_ttl[i] > subtract) + data->rr_ttl[i] -= subtract; + else data->rr_ttl[i] = 0; + } +} + +static void +adjust_msg_ttl(struct dns_msg* msg, time_t adjust) +{ + size_t i; + if(msg->rep->ttl > adjust) + msg->rep->ttl -= adjust; + else msg->rep->ttl = 0; + msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl); + + for(i=0; i<msg->rep->rrset_count; i++) { + packed_rrset_ttl_subtract((struct packed_rrset_data*)msg-> + rep->rrsets[i]->entry.data, adjust); + } +} + /** convert dns message in buffer to return_msg */ static int parse_data(struct module_qstate* qstate, struct sldns_buffer* buf) @@ -420,24 +451,18 @@ parse_data(struct module_qstate* qstate, struct sldns_buffer* buf) qstate->return_rcode = LDNS_RCODE_NOERROR; /* see how much of the TTL expired, and remove it */ + if(*qstate->env->now <= (time_t)timestamp) { + verbose(VERB_ALGO, "cachedb msg adjust by zero"); + return 1; /* message from the future (clock skew?) */ + } adjust = *qstate->env->now - (time_t)timestamp; + if(qstate->return_msg->rep->ttl < adjust) { + verbose(VERB_ALGO, "cachedb msg expired"); + return 0; /* message expired */ + } verbose(VERB_ALGO, "cachedb msg adjusted down by %d", (int)adjust); - /*adjust_msg(qstate->return_msg, adjust);*/ - /* TODO: - msg->rep->ttl = r->ttl - adjust; - msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl); - for(i=0; i<d->count + d->rrsig_count; i++) { - if(d->rr_ttl[i] < adjust) - d->rr_ttl[i] = 0; - else d->rr_ttl[i] -= adjust; - } - if(d->ttl < adjust) - d->ttl = 0; - else d->ttl -= adjust; - */ - /* TODO */ - - return 0; + adjust_msg_ttl(qstate->return_msg, adjust); + return 1; } /** |