static volatile pid_t pid = 0;
static volatile int pipewrite;
+static int alarm_queued = 0;
static int set_dns_listeners(time_t now, fd_set *set, int *maxfdp);
static void check_dns_listeners(fd_set *set, time_t now);
}
}
-void send_alarm(void)
+/* now == 0 -> queue immediate callback */
+void send_alarm(time_t event, time_t now)
{
- send_event(pipewrite, EVENT_ALARM, 0, NULL);
+
+ if (now != 0 && event == 0)
+ return;
+
+ if ((now == 0 || difftime(event, now) <= 0.0))
+ {
+ if (!alarm_queued)
+ {
+ send_event(pipewrite, EVENT_ALARM, 0, NULL);
+ alarm_queued = 1;
+ }
+ }
+ else
+ alarm((unsigned)difftime(event, now));
}
void send_event(int fd, int event, int data, char *msg)
break;
case EVENT_ALARM:
+ alarm_queued = 0;
#ifdef HAVE_DHCP
if (daemon->dhcp || daemon->dhcp6)
{
}
#ifdef HAVE_DHCP6
else if (daemon->ra_contexts)
- {
- /* Not doing DHCP, so no lease system, manage
- alarms for ra only */
- time_t next_event = periodic_ra(now);
- if (next_event != 0)
- alarm((unsigned)difftime(next_event, now));
- }
+ /* Not doing DHCP, so no lease system, manage alarms for ra only */
+ send_alarm(periodic_ra(now), now);
#endif
#endif
break;
check_dhcp_hosts(0);
lease_update_from_configs();
lease_update_file(now);
- lease_update_dns();
+ lease_update_dns(1);
}
#ifdef HAVE_DHCP6
else if (daemon->ra_contexts)