}
zone->refreshtime = now;
if (zone->loop != NULL) {
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
}
result = ISC_R_SUCCESS;
goto cleanup;
now = isc_time_now();
zone->nsec3chaintime = now;
if (zone->loop != NULL) {
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
}
}
}
isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
dns_zone_log(zone, ISC_LOG_DEBUG(1), "next key refresh: %s", timebuf);
- dns__zone_settimer(zone, &timenow);
+ dns__zone_settimer(zone, timenow);
}
/*
return answer;
}
+/*
+ * Compare times treating epoch as "unset".
+ */
+static inline bool
+time_greater_equal(isc_time_t a, isc_time_t b) {
+ return !isc_time_isepoch(&b) && isc_time_compare(&a, &b) >= 0;
+}
+
+static inline isc_time_t
+time_min(isc_time_t a, isc_time_t b) {
+ if (isc_time_isepoch(&b)) {
+ return a;
+ }
+ return isc_time_isepoch(&a) || isc_time_compare(&b, &a) < 0 ? b : a;
+}
+
static void
process_zone_setnsec3param(dns_zone_t *zone) {
ISC_LIST_FOREACH(zone->setnsec3param_queue, npe, link) {
}
}
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
}
/*
/* Mark the zone for immediate refresh. */
zone->refreshtime = now;
if (zone->loop != NULL) {
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
}
result = ISC_R_SUCCESS;
} else if (zone->type == dns_zone_primary ||
* zone_maintenance was called.
*/
if (zone->secure->loop != NULL) {
- dns__zone_settimer(zone->secure, &now);
+ dns__zone_settimer(zone->secure, now);
}
}
timenow = isc_time_now();
DNS_ZONE_TIME_ADD(&timenow, dns_zone_mkey_hour, &timethen);
zone->refreshkeytime = timethen;
- dns__zone_settimer(zone, &timenow);
+ dns__zone_settimer(zone, timenow);
isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
dnssec_log(zone, ISC_LOG_DEBUG(1), "retry key refresh: %s",
UNLOCK_ZONE(zone);
break;
}
- rekey = (!isc_time_isepoch(&zone->refreshkeytime) &&
- isc_time_compare(&now, &zone->refreshkeytime) >= 0);
+ rekey = time_greater_equal(now, zone->refreshkeytime);
UNLOCK_ZONE(zone);
if (rekey) {
zone_rekey(zone);
UNLOCK_ZONE(zone);
break;
}
- sign = !isc_time_isepoch(&zone->signingtime) &&
- isc_time_compare(&now, &zone->signingtime) >= 0;
- resign = !isc_time_isepoch(&zone->resigntime) &&
- isc_time_compare(&now, &zone->resigntime) >= 0;
- chain = !isc_time_isepoch(&zone->nsec3chaintime) &&
- isc_time_compare(&now, &zone->nsec3chaintime) >= 0;
- warn_expire = !isc_time_isepoch(&zone->keywarntime) &&
- isc_time_compare(&now, &zone->keywarntime) >= 0;
+ sign = time_greater_equal(now, zone->signingtime);
+ resign = time_greater_equal(now, zone->resigntime);
+ chain = time_greater_equal(now, zone->nsec3chaintime);
+ warn_expire = time_greater_equal(now, zone->keywarntime);
UNLOCK_ZONE(zone);
if (sign) {
break;
}
LOCK_ZONE(zone);
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
UNLOCK_ZONE(zone);
}
if (result == ISC_R_SUCCESS) {
dns__zone_set_resigntime(zone);
if (zone->loop != NULL) {
- isc_time_t now;
- now = isc_time_now();
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, isc_time_now());
}
}
}
zone->dumptime = dumptime;
}
if (zone->loop != NULL) {
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
}
}
void
dns_zone_notify(dns_zone_t *zone, bool nodefer) {
- isc_time_t now;
-
REQUIRE(DNS_ZONE_VALID(zone));
LOCK_ZONE(zone);
}
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOTIFYNODEFER);
}
- now = isc_time_now();
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, isc_time_now());
UNLOCK_ZONE(zone);
}
zone_needdump(zone, 0);
}
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
}
/*
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_NOEDNS);
if (exiting || dns_remote_done(&zone->primaries)) {
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH);
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
goto free_stub;
}
queue_soa_query(zone);
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_NEEDREFRESH);
zone->refreshtime = now;
}
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
goto detach;
}
*/
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH);
zone->refreshtime = now;
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
dns_request_destroy(&zone->request);
goto detach;
zone__settimer(void *arg) {
zone_settimer_t *data = arg;
dns_zone_t *zone = data->zone;
- isc_time_t *now = &data->now;
+ isc_time_t now = data->now;
isc_time_t next;
bool free_needed = false;
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_DUMPING))
{
INSIST(!isc_time_isepoch(&zone->dumptime));
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->dumptime, &next) < 0)
- {
- next = zone->dumptime;
- }
+ next = time_min(next, zone->dumptime);
}
if (zone->type == dns_zone_redirect) {
break;
}
- if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING) &&
- !isc_time_isepoch(&zone->refreshkeytime))
- {
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->refreshkeytime, &next) < 0)
- {
- next = zone->refreshkeytime;
- }
- }
- if (!isc_time_isepoch(&zone->resigntime)) {
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->resigntime, &next) < 0)
- {
- next = zone->resigntime;
- }
- }
- if (!isc_time_isepoch(&zone->keywarntime)) {
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->keywarntime, &next) < 0)
- {
- next = zone->keywarntime;
- }
- }
- if (!isc_time_isepoch(&zone->signingtime)) {
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->signingtime, &next) < 0)
- {
- next = zone->signingtime;
- }
- }
- if (!isc_time_isepoch(&zone->nsec3chaintime)) {
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->nsec3chaintime, &next) < 0)
- {
- next = zone->nsec3chaintime;
- }
+ if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING)) {
+ next = time_min(next, zone->refreshkeytime);
}
+ next = time_min(next, zone->resigntime);
+ next = time_min(next, zone->keywarntime);
+ next = time_min(next, zone->signingtime);
+ next = time_min(next, zone->nsec3chaintime);
break;
case dns_zone_secondary:
if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESH) &&
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOPRIMARIES) &&
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADING) &&
- !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADPENDING) &&
- !isc_time_isepoch(&zone->refreshtime) &&
- (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->refreshtime, &next) < 0))
+ !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADPENDING))
{
- next = zone->refreshtime;
+ next = time_min(next, zone->refreshtime);
}
- if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) &&
- !isc_time_isepoch(&zone->expiretime))
- {
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->expiretime, &next) < 0)
- {
- next = zone->expiretime;
- }
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED)) {
+ next = time_min(next, zone->expiretime);
}
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NEEDDUMP) &&
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_DUMPING))
{
INSIST(!isc_time_isepoch(&zone->dumptime));
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->dumptime, &next) < 0)
- {
- next = zone->dumptime;
- }
+ next = time_min(next, zone->dumptime);
}
break;
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_DUMPING))
{
INSIST(!isc_time_isepoch(&zone->dumptime));
- if (isc_time_isepoch(&next) ||
- isc_time_compare(&zone->dumptime, &next) < 0)
- {
- next = zone->dumptime;
- }
+ next = time_min(next, zone->dumptime);
}
if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING)) {
- if (isc_time_isepoch(&next) ||
- (!isc_time_isepoch(&zone->refreshkeytime) &&
- isc_time_compare(&zone->refreshkeytime, &next) <
- 0))
- {
- next = zone->refreshkeytime;
- }
+ next = time_min(next, zone->refreshkeytime);
}
break;
if (isc_time_isepoch(&next)) {
zone_timer_stop(zone);
} else {
- zone_timer_set(zone, &next, now);
+ zone_timer_set(zone, &next, &now);
}
free:
}
void
-dns__zone_settimer(dns_zone_t *zone, isc_time_t *now) {
+dns__zone_settimer(dns_zone_t *zone, isc_time_t now) {
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING)) {
return;
}
zone_settimer_t *arg = isc_mem_get(zone->mctx, sizeof(*arg));
*arg = (zone_settimer_t){
.zone = zone,
- .now = *now,
+ .now = now,
};
isc_refcount_increment0(&zone->irefs);
isc_async_run(zone->loop, zone__settimer, arg);
static void
cancel_refresh(dns_zone_t *zone) {
- isc_time_t now;
-
/*
* 'zone' locked by caller.
*/
ENTER;
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH);
- now = isc_time_now();
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, isc_time_now());
}
isc_result_t
*/
dns__zone_set_resigntime(zone);
timenow = isc_time_now();
- dns__zone_settimer(zone, &timenow);
+ dns__zone_settimer(zone, timenow);
UNLOCK_ZONE(zone);
dns_db_closeversion(zone->rss_db, &zone->rss_oldver, false);
LOCK_ZONE(zone);
dns__zone_set_resigntime(zone);
timenow = isc_time_now();
- dns__zone_settimer(zone, &timenow);
+ dns__zone_settimer(zone, timenow);
UNLOCK_ZONE(zone);
if (result == DNS_R_UNCHANGED) {
level = ISC_LOG_INFO;
dns__zone_stats_increment(zone, dns_zonestatscounter_xfrfail);
break;
}
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
/*
* We are called as the done callback of a zone
if (isc_time_isepoch(&zone->signingtime)) {
zone->signingtime = now;
if (zone->loop != NULL) {
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
}
}
}
zone_needdump(zone, DNS_DUMP_DELAY);
- dns__zone_settimer(zone, &timenow);
+ dns__zone_settimer(zone, timenow);
/* Remove any signatures from removed keys. */
ISC_LIST_FOREACH(rmkeys, key, link) {
DNS_ZONE_TIME_ADD(&timenow, nexttime_seconds, &timenext);
zone->refreshkeytime = timenext;
- dns__zone_settimer(zone, &timenow);
+ dns__zone_settimer(zone, timenow);
isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
dnssec_log(zone, ISC_LOG_DEBUG(3),
}
}
- dns__zone_settimer(zone, &timenow);
+ dns__zone_settimer(zone, timenow);
isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
dnssec_log(zone, ISC_LOG_INFO, "next key event: %s", timebuf);
now = isc_time_now();
zone->refreshkeytime = now;
- dns__zone_settimer(zone, &now);
+ dns__zone_settimer(zone, now);
UNLOCK_ZONE(zone);
}