Commit 47a95169 authored by Simon Kelley's avatar Simon Kelley

Use event system to re-send query on new route. Tidies module boundaries.

parent cdb755c5
......@@ -401,7 +401,7 @@ void route_sock(void)
else if (msg->ifm_type == RTM_NEWADDR)
{
del_family = 0;
send_newaddr();
queue_event(EVENT_NEWADDR);
}
else if (msg->ifm_type == RTM_DELADDR)
{
......@@ -439,7 +439,7 @@ void route_sock(void)
of += sizeof(long) - (diff & (sizeof(long) - 1));
}
send_newaddr();
queue_event(EVENT_NEWADDR);
}
}
......
......@@ -30,6 +30,7 @@ static void sig_handler(int sig);
static void async_event(int pipe, time_t now);
static void fatal_event(struct event_desc *ev, char *msg);
static int read_event(int fd, struct event_desc *evp, char **msg);
static void poll_resolv(int force, int do_reload, time_t now);
int main (int argc, char **argv)
{
......@@ -1037,9 +1038,9 @@ void send_alarm(time_t event, time_t now)
}
}
void send_newaddr(void)
void queue_event(int event)
{
send_event(pipewrite, EVENT_NEWADDR, 0, NULL);
send_event(pipewrite, event, 0, NULL);
}
void send_event(int fd, int event, int data, char *msg)
......@@ -1239,7 +1240,13 @@ static void async_event(int pipe, time_t now)
case EVENT_NEWADDR:
newaddress(now);
break;
case EVENT_NEWROUTE:
resend_query();
/* Force re-reading resolv file right now, for luck. */
poll_resolv(0, 1, now);
break;
case EVENT_TERM:
/* Knock all our children on the head. */
for (i = 0; i < MAX_PROCS; i++)
......@@ -1272,7 +1279,7 @@ static void async_event(int pipe, time_t now)
}
}
void poll_resolv(int force, int do_reload, time_t now)
static void poll_resolv(int force, int do_reload, time_t now)
{
struct resolvc *res, *latest;
struct stat statbuf;
......
......@@ -166,6 +166,7 @@ struct event_desc {
#define EVENT_TFTP_ERR 20
#define EVENT_INIT 21
#define EVENT_NEWADDR 22
#define EVENT_NEWROUTE 23
/* Exit codes. */
#define EC_GOOD 0
......@@ -1183,6 +1184,7 @@ struct frec *get_new_frec(time_t now, int *wait, int force);
int send_from(int fd, int nowild, char *packet, size_t len,
union mysockaddr *to, struct all_addr *source,
unsigned int iface);
void resend_query();
/* network.c */
int indextoname(int fd, int index, char *name);
......@@ -1290,11 +1292,10 @@ unsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr,
int make_icmp_sock(void);
int icmp_ping(struct in_addr addr);
#endif
void send_newaddr(void);
void queue_event(int event);
void send_alarm(time_t event, time_t now);
void send_event(int fd, int event, int data, char *msg);
void clear_cache_and_reload(time_t now);
void poll_resolv(int force, int do_reload, time_t now);
/* netlink.c */
#ifdef HAVE_LINUX_NETWORK
......
......@@ -2130,6 +2130,25 @@ static struct frec *lookup_frec_by_sender(unsigned short id,
return NULL;
}
/* Send query packet again, if we can. */
void resend_query()
{
if (daemon->srv_save)
{
int fd;
if (daemon->srv_save->sfd)
fd = daemon->srv_save->sfd->fd;
else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
fd = daemon->rfd_save->fd;
else
return;
while(sendto(fd, daemon->packet, daemon->packet_len, 0,
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
}
}
/* A server record is going away, remove references to it */
void server_gone(struct server *server)
......
......@@ -356,28 +356,10 @@ static void nl_async(struct nlmsghdr *h)
struct rtmsg *rtm = NLMSG_DATA(h);
if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
{
/* Force re-reading resolv file right now, for luck. */
daemon->last_resolv = 0;
if (daemon->srv_save)
{
int fd;
if (daemon->srv_save->sfd)
fd = daemon->srv_save->sfd->fd;
else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
fd = daemon->rfd_save->fd;
else
return;
while(sendto(fd, daemon->packet, daemon->packet_len, 0,
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
}
}
queue_event(EVENT_NEWROUTE);
}
else if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR)
send_newaddr();
queue_event(EVENT_NEWADDR);
}
#endif
......
......@@ -1559,7 +1559,6 @@ int reload_servers(char *fname)
return gotone;
}
#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK)
/* Called when addresses are added or deleted from an interface */
void newaddress(time_t now)
{
......@@ -1584,7 +1583,6 @@ void newaddress(time_t now)
#endif
}
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment