static int
cache_is_expired(time_t t, uint32_t ttl, int frac)
{
- if (time(NULL) - t >= ttl * frac / 100)
+ if (monotonic_time() - t >= ttl * frac / 100)
return 1;
return 0;
avl_for_each_element_safe(&services, s, avl, t)
if (!strcmp(s->entry, entry)) {
s->refresh = 50;
- s->time = time(NULL);
+ s->time = monotonic_time();
return s;
}
&host_buf, hlen ? hlen + 1 : 0);
s->avl.key = s->entry = strcpy(entry_buf, entry);
- s->time = time(NULL);
+ s->time = monotonic_time();
s->ttl = ttl;
s->iface = iface;
s->refresh = 50;
if (r) {
if (!a->ttl) {
DBG(1, "D -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);
- r->time = time(0) + 1 - r->ttl;
+ r->time = monotonic_time() + 1 - r->ttl;
} else {
r->ttl = a->ttl;
DBG(1, "A -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);
r->ttl = a->ttl;
r->port = port;
r->rdlength = dlen;
- r->time = time(NULL);
+ r->time = monotonic_time();
r->iface = iface;
if (tlen)
snprintf(mdns_hostname, sizeof(mdns_hostname), "%s", utsname.nodename);
snprintf(mdns_hostname_local, sizeof(mdns_hostname_local), "%s.local", utsname.nodename);
}
+
+time_t monotonic_time(void)
+{
+ struct timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return ts.tv_sec;
+}
#define _UTIL_H__
#include <stdint.h>
+#include <time.h>
#define DBG(level, fmt, ...) do { \
if (debug >= level) \
extern void get_hostname(void);
extern uint32_t rand_time_delta(uint32_t t);
+extern time_t monotonic_time(void);
#endif